8.4.4 Spring的AOP支持

8.4.4 Spring的AOP支持

Spring中的AOP代理由SpringloC容器负责生成、管理,其依赖关系也由IoC容器负责管理。因此,AOP代理可以直接使用容器中的其他Bean实例作为目标,这种关系可由IoC容器的依赖注入提供。

Spring创建AOP代理的方式

Spring默认使用Java动态代理来创建AOP代理,这样就可以为任何接口实例创建代理了。
Spring也可以使用cglib代理,在需要代理类而不是代理接口的时候, Spring会自动切换为使用cglib代理。但Spring推荐使用面向接口编程,因此业务对象通常都会实现一个或多个接口,此时默认将使用JDK动态代理,但也可强制使用cglib代理。

Spring AOP使用纯Java实现。它不需要特定的编译工具, Spring AOP也不需要控制类装载器层次,因此它可以在所有的Java Web容器或应用服务器中运行良好。

Spring目前仅支持将方法调用作为连接点

Spring目前仅支持将方法调用作为连接点( Joinpoint),如果需要把对成员变量的访问和更新也作为增强处理的连接点,则可以考虑使用AspectJ

Spring侧重于AOP实现和Spring IoC容器的支持

Spring实现AOP的方法跟其他的框架不同。 Spring并不是要提供最完整的AOP实现(尽管SpringAOP有这个能力), Spring侧重于AOP实现和Spring IoC容器之间的整合,用于帮助解决企业级开发中的常见问题。
因此, SpringAOP通常和Spring loC容器一起使用, Spring AOP从来没有打算通过提供一种全面的AOP解决方案来与AspectJ竟争。 Spring AOP采用基于代理的AOP实现方案,而AspectJ则采用编译时增强的解决方案。
Spring可以无缝地整合Spring AOPIoCAspectJ.,使得所有的AOP应用完全融入基于Spring的框架中,这样的集成不会影响Spring AOP API或者AOP Alliance API, Spring AOP保持了向下兼容性,依然允许直接使用Spring AOP API来完成AOP编程。

AOP编程中需要程序员参与的部分

一旦掌握了上面AOP的相关概念,不难发现进行AOP编程其实是很简单的事情。纵观AOP编程,其中需要程序员参与的只有三个部分。

  1. 定义普通业务组件
  2. 定义切入点,一个切入点可能横切多个业务组件。
  3. 定义增强处理,增强处理就是在AOP框架为普通业务组件织入的处理动作。

其中第一个部分是最平常不过的事情,所以无须额外说明。那么进行AOP编程的关键就是定义切入点和定义增强处理。一旦定义了合适的切入点和增强处理,AOP框架将会自动生成AOP代理,而AOP代理的方法大致有如下公式:
AOP代理的方法=增强处理+目标对象的方法

Spring定义切入点和增强处理的方式

通常建议使用AspectJ方式来定义切入点和增强处理,在这种方式下, Spring依然有如下两种选择来定义切入点增强处理

  1. 基于注解的”零配置”方式:使用@Aspect@Pointcut等注解来标注切入点和增强处理。
  2. 基于XML配置文件的管理方式:使用Spring配置文件来定义切入点和增强处理