8.4.4: Spring 的AOP支持

来源:互联网 发布:起点作者写作软件 编辑:程序博客网 时间:2024/06/05 11:17

Spring中AOP代理由Spring的IOC容器负责生成、管理,其依赖关系也由IOC容器负责管理。因此,AOP代理可以直接使用容器中的其他Bean实例作为目标,这种关系可由IOC容器的依赖注入提供。Spring默认使用Java动态代理来创建AOP代理,这样就可以为任何接口实例创建代理了。

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

Spring AOP使用纯Java实现,它不需要专门的编译过程。Spring AOP不需要控制类装载器层次,因此它可以在所有JavaWeb容器或应用服务器中运行良好。

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

Spring实现AOP的方法跟其他的框架不同,Spring并不是要提供最完整的AOP实现,Spring侧重于AOP实现和Spring IOC容器之间的整合,用于帮助解决在企业级开发中的常见问题。

因此Spring的AOP通常和Spring IOC容器一起使用,Spring AOP从来没有打算通过提供一种全面的AOP解决方案来与AspectJ竞争。Spring AOP采用基于代理的AOP实现方案,而AspectJ则采用编译时增强的解决方案。

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

① 定义普通业务组件。

② 定义切入点,一个切入点可能横切多个业务组件。

③ 定义增强处理,增强处理就是在AOP框架为普通业务组件织入的处理动作。

上面三个部分的第一个部分是最平常不过的事情,那么进行AOP编程的关键就是定义切入点和定义增强处理。一旦定义了合适的切入点和增强处理,AOP框架将会自动生成AOP代理,而AOP代理的方法大致有如下公式:

代理对象的方法 = 增强处理 + 被代理对象的方法

我们使用AspectJ方式来定义切入点和增强处理,在这种方式下,Spring有两种选择来定义切入点和增强处理。

① 基于 Annotation 的零配置方式:使用@Aspect、@Pointcut等Annotation来标注切入点和增强处理。

② 基于XML配置文件的管理方式:使用Spring配置文件来定义切入点和增强处理。