第三讲
一、AOP的基本概念
- 织入:将增强处理添加到目标对象中,并创建一个增强的对象的过程就是织入。织入有两种实现方式:编译时增强(如AspectJ)和运行时增强(如Spring AOP)
- 引入:将方法或者字段添加到被处理的类中。
- 目标对象:被AOP框架进行增强处理的对象。
- AOP代理:AOP框架创建的对象。
2、需要代理类不是接口的时候,Spring会自动的切换为使用cglib代理。
3、基于注解的“零配置”方法
- 定义切面bean:
@Aspect
- 定义Before增强处理:
@Before("execution(* cc.wsyw126.spring.service.imp.*.*(..))")
- 第一个*表示返回类型不限
- 第二个*表示类名不限
- 第三个*表示方法名不限
- 括号中的..代表任意个数、类型不限的形参
- Pointcut可以省去(value作用同pointcut)
- 定义AfterReturning增强处理:
@AfterReturning(returning="rt",pointcut = "execution(* cc.wsyw126.spring.service.imp.*.*(..))")
- 声明rt时指定的类型会限制目标方法必须返回指定类型的值或没有返回值
- AfterReturning修饰的方法,必须有参数。若将参数rt的类型声明为Object,意味着对目标方法的返回值不加限制
- 定义AfterThrowing增强处理:
@AfterThrowing(throwing="ex",pointcut="execution(* cc.wsyw126.spring.service.imp.*.*(..))")
- 声明ex时指定的类型会限制目标方法必须抛出指定类型的异常
- AfterThrowing修饰的方法,必须有参数。若将参数ex的类型声明为Throwable,意味着对目标方法抛出的异常不加限制
- After增强处理:
@After("execution(* cc.wsyw126.spring.service.imp.*.*(..))")
- AfterReturning:只有在目标方法成功完成后才会被织入。
- After:不管方法如何结束(包括成功和异常终止),它都会被织入。
- 基于ii的性质,After增强处理通常用于释放资源。
- Around增强处理
- 近似于before和afterreturning的总和。
- 不同的是:既可以决定目标方法在什么时候执行,如何执行,甚至可以完全阻止目标方法的执行。
- 通常需要在线程安全的情况下使用。
- 增强处理的方法的第一个形参必须是proceedingJoinPoint类型(并且至少包含一个形参)。
- 在方法内,调用proceed()方法才会执行目标方法,这就是控制目标方法执行时机和如何执行的关键。如果没有调用,则目标方法不会执行。
-
4、当不同切面里的两个增强处理需要在同一个连接点被织入时,spring AOP将以随机的顺序织入。如果需要执行优先级,有两种方法:
- 让切面类实现org.springframework.core.Ordered接口,实现int getOrder()方法,该方法返回值越小,优先级越高。
- 直接使用@Order注解来修饰一个切面类。可指定一个int型的value属性,该属性值越小,优先级越高。
5、如果只访问目标方法的参数,可以使用args切入点表达式来绑定目标方法的参数。
@AfterReturning(returning="rvt" , pointcut="execution(* org.crazyit.app.service.impl.*.*(..)) && args(arg0,arg1,..)")
,可以有多个参数只要第一个和第二个与access中的类型匹配即可。
6、定义切入点:
- 包含两部分
- 一个切入点的表达式。
- 一个包含名字和任意参数的方法签名。
- 用法实例:
@AfterReturning(returning="rvt", pointcut="SystemArchitecture.myPointcut()")
7、切入点指示符:
- execution:用于匹配执行方法的连接点。
Execution(modifiers-pattern?ret-type-pattern declaring-type-pattern?name-pattern(param-pattern) throws-pattern?)