Spring AOP的实现主要经历了2代:
- Spring 1.x版本,自己实现了AOP的功能
- Spring 2.x版本,Spring集成了AspectJ的实现,但实际上只是拿AspectJ的“皮大衣“用了一下,因为底层的实现和织入方式还是1.x原先的实现体系。
Spring AOP也是对目标类增强,生成代理类。Spring AOP的运行时增强,而AspectJ是编译时增强。
Spring提供了四种类型的Aop支持:
- 基于经典的Spring AOP
- 纯POJO切面
@ASpectJ
注解驱动的切面注入式 AspectJ 切面(其实与 Spring 并无多大的关系,这个就是使用 AspectJ 这个框架实现 Aop 编程)
Spring AOP自动代理时机
在service bean的创建过程中(也就是
getBean("service")
),AOP通过 BeanPostProcess 后置处理器操作进行介入 分为2种情况:用户自定义了targetSource,则 Bean 的创建(实例化、填充、初始化)均由用户负责,Spring Ioc不会在管该代理目标对象traget,这种情况基本上不会发生,很多人用了几年Spring可能都不知道有它的存在。
- 正常情况下都是Spring Ioc完成代理对象target的实例化、填充、初始化。然后在初始化后置处理器中进行介入,对bean也就是service进行代理。
Adivce之间的顺序关系
一个方法被一个aspect类拦截时的执行顺序如下:
@Around->@Before->方法执行->@Around->@After->@AfterReturning/@AfterThrowing
当方法正常结束时,执行@AfterReturning
。方法异常结束时,执行@AfterThrowing
。两者不会同时执行。
一个方法被多个aspect类拦截时的执行顺序如下:多个aspect的执行顺序可以通过
@Order
注解或者实现Oreder
接口来控制。