AOP的几个核心概念
- Aspect:切面,由一系列切点、增强方法组成,切面一般使用@Aspect注解来标识。
- Join point:连接点,在Spring AOP,一个连接点总是代表一次方法的执行。
- Advice:增强,在连接点执行的动作。
- Pointcut:切点,定义如何匹配到连接点。
- Introduction:引入,为现有类型声明额外的方法和属性。
- Target object:目标对象,被一个或多个切面增强的对象,在Spring AOP中通过动态代理来实现,这个对象永远是一个代理对象。
- AOP proxy:AOP代理,一个被AOP框架创建的对象,用于实现切面约定(增强方法的执行等)。在Spring框架中AOP代理的默认方式是:有接口,就使用基于接口的JDK动态代理,否则使用基于类的CGLIB动态代理。但是我们可以通过设置proxy-target-class=“true”,完全使用CGLIB动态代理。
- Weaving:织入,将一个或多个切面与类或对象链接在一起创建一个被增强对象。织入能发生在编译时 (compile time )(使用AspectJ编译器),加载时(load time),或运行时(runtime) 。Spring AOP默认就是运行时织入。
Spring AOP的增强类型
- 前置增强(Before advice):在连接点之前运行,但不能阻止到连接点的流程继续执行(除非抛出异常)
- 返回增强(After returning advice):在连接点正常完成后运行的增强(例如,方法返回没有抛出异常)
- 异常增强(After thorwing advice):如果方法抛出异常退出需要执行的增强
- 后置增强(After (finally) Advice):无论连接点是正常或者异常退出,都会执行该增强
- 环绕增强(Around advice):围绕连接点的增强,例如方法的调用。环绕增强能在方法的调用之前和调用之后自定义行为。它还可以选择方法是继续执行或者去缩短方法的执行通过返回自己的值或者抛出异常。
同一切面,不同advice的执行顺序
直接上结果,图片转自Spring AOP 执行顺序
不同切面,advice的执行顺序
Spring AOP通过指定aspect的优先级,来控制不同aspect,advice的执行顺序,有两种方式:
- Aspect 类添加注解:org.springframework.core.annotation.Order,使用注解value属性指定优先级。
- Aspect 类实现接口:org.springframework.core.Ordered,实现 Ordered 接口的 getOrder() 方法。
数值越低,表明优先级越高,@Order 默认为最低优先级,即最大数值
转自Spring AOP之坑:完全搞清楚advice的执行顺序的结论
不同aspect,advice的执行顺序:先入后出,后入先出
- 入操作(Around(接入点执行前)、Before),优先级越高,越先执行;
- 一个切面的入操作执行完,才轮到下一切面,所有切面入操作执行完,才开始执行接入点;
- 出操作(Around(接入点执行后)、After、AfterReturning、AfterThrowing),优先级越低,越先执行;
- 一个切面的出操作执行完,才轮到下一切面,直到返回到调用点。