AOP
AOP的底层原理是使用动态代理。
1.JDK动态代理 使用接口方式实现动态代理
2.CGLIB动态代理 没有接口,使用继承方式实现动态代理
AOP术语
1.连接点
类里面的哪些方法可以被增强,这些方法称为连接点。
2.切入点
实际被真正增强的方法,称为切入点。
3.通知(增强)
1)实际增强的逻辑部分称为通知(增强)
2)通知有很多种类型
* 前置通知
* 后置通知
* 环绕通知
* 异常通知
* 最终通知(最后始终会被执行,相当于finaly)
4.切面
把通知应用到切入点的过程(动作)
AOP操作
准备工作
有多种方式可以实现,但Spring一般都基于AspectJ实现AOP操作
1.引入依赖
spring-aspects, com.springsource.net.sf.cglib, com.springsource.org.aopalliance, com.springsource.org.aspectj.weaver
2.切入点表达式。(知道要对哪个类里面的哪个方法进行增强)
execution([权限修饰符] [返回类型] [类全路径] [方法名称]([方法参数]))
1)excution(* com.duobee.dao.UserDao.add(..)) UserDao里add方法
2)excution(* com.duobee.dao.UserDao.*(..)) UserDao类里所有方法
3)excution(* com.duobee.dao.*.*(..)) dao包里所有类,所有方法
具体操作
1. 在spring配置文件中,开启注解扫描
2. 使用注解创建类的对象
3. 在增强类上面添加注解 @Aspect
4. 在spring配置文件中开启生成代理对象
<aop:sapectj-autoproxy></aop:sapectj-autoproxy> 意思是在spring容器中找到@aspect注解,有就创建代理对象。
5. 配置不同类型的通知。
1)在增强类的里面,在作为通知的方法上面添加通知类型的注解,使用切入点表达式配置作用域
@Around(value="excution(* com.duobee.dao.*.*(..))")
public void around(ProceedingJoinPoint proceedingJoinPoint ) throws Throwable{
System.out.println("环绕之前............");
//被增强的方法执行
proceedingJoinPoint.proceed();
System.out.println("环绕之后............");
}
6.相同的切入点进行抽取。
定义一个方法, 方法名字自定义,在方法上面加入注解@Pointcut(value="excution(* com.duobee.dao.*.*(..))")
7. 有多个增强类在同一个方法进行增强,设置增强类的优先级
在增强类的上面添加注解@Order(数值类型值),数值类型的值越小优先级越高, 从0开始
使用的时候只需要在通知类型注解的value里面加入方法名称就可以使用公共的切入点了。
完全注解开发
@Configuration 注解配置类
@ComponentScan(basePackages={"com.duobee"}) 配置注解扫描类
@EnableAspectJAutoProxy(proxyTargetClass=true) 配置生成代理对象

浙公网安备 33010602011771号