8.4.4 Spring的AOP支持
8.4.4 Spring的AOP支持
Spring
中的AOP
代理由Spring
的loC
容器负责生成、管理,其依赖关系也由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
容器之间的整合,用于帮助解决企业级开发中的常见问题。
因此, Spring
的AOP
通常和Spring loC
容器一起使用, Spring AOP
从来没有打算通过提供一种全面的AOP
解决方案来与AspectJ
竟争。 Spring AOP
采用基于代理的AOP
实现方案,而AspectJ
则采用编译时增强的解决方案。Spring
可以无缝地整合Spring AOP
、IoC
和AspectJ
.,使得所有的AOP
应用完全融入基于Spring
的框架中,这样的集成不会影响Spring AOP API
或者AOP Alliance API, Spring AOP
保持了向下兼容性,依然允许直接使用Spring AOP API
来完成AOP
编程。
AOP编程中需要程序员参与的部分
一旦掌握了上面AOP
的相关概念,不难发现进行AOP
编程其实是很简单的事情。纵观AOP
编程,其中需要程序员参与的只有三个部分。
- 定义普通业务组件
- 定义切入点,一个切入点可能横切多个业务组件。
- 定义增强处理,增强处理就是在
AOP
框架为普通业务组件织入的处理动作。
其中第一个部分是最平常不过的事情,所以无须额外说明。那么进行AOP
编程的关键就是定义切入点和定义增强处理。一旦定义了合适的切入点和增强处理,AOP
框架将会自动
生成AOP
代理,而AOP
代理的方法大致有如下公式:AOP代理的方法=增强处理+目标对象的方法
Spring定义切入点和增强处理的方式
通常建议使用AspectJ
方式来定义切入点和增强处理,在这种方式下, Spring
依然有如下两种选择来定义切入点
和增强处理
。
- 基于注解的”零配置”方式:使用
@Aspect
、@Pointcut
等注解来标注切入点和增强处理。 - 基于
XML
配置文件的管理方式:使用Spring
配置文件来定义切入点和增强处理