Spring AOP - 图1
Spring AOP - 图2
Spring AOP的实现主要经历了2代:

  1. Spring 1.x版本,自己实现了AOP的功能
  2. 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进行代理。

Spring AOP - 图3

Adivce之间的顺序关系

一个方法被一个aspect类拦截时的执行顺序如下:

  1. @Around->@Before->方法执行->@Around->@After->@AfterReturning/@AfterThrowing

当方法正常结束时,执行@AfterReturning。方法异常结束时,执行@AfterThrowing。两者不会同时执行。
Spring AOP - 图4
一个方法被多个aspect类拦截时的执行顺序如下:
Spring AOP - 图5多个aspect的执行顺序可以通过@Order注解或者实现Oreder接口来控制。

参考文档

  1. Spring AOP总结
  2. Spring AOP
  3. Spring Aop 和 AspectJ 的区别和联系