AOP 即面向切面编程,在前文已经有所介绍,具体的实现方式有以下三种:
- 静态代理:通过为要执行切面操作的类手动定义一个额外的类来完成功能
- 动态代理:在程序运行时动态地生成代理类来实现切面的具体功能
AspectJ
:对 相关的.class
文件进行对应的处理,加入对相关的切点织入一些功能代码来完成
在上述三种实现方式中,静态代理的方式是不会被考虑的,因为这会导致系统代码的耦合,因此主要的实现方式就是动态代理和 AspectJ
一般来讲,使用 AspectJ
来实现 AOP 是最好的解决方案,但是由于 AspectJ
无法被 javac
编译,需要引入额外的编译插件才能完成,因此在 Spring 中对于 AOP 的实现是通过动态代理的方式来实现的
注意,Spring 中对于对象的管理都是以 Bean 的形式来管理的,因此 Spring AOP 相关的类只有在 Spring IOC 中才会有意义
首先回忆一下 Spring IOC 中实例化 Bean 的基本流程:
分析一下实例化 Bean 的流程,可以简单地猜想一下 Spring AOP 的是否是基于 BeanPostProcessor
来实现的?
基于 Proxy Bean 的 AOP
按照代理模式的设计,客户端会直接调用 Proxy 的接口,然后在 Proxy 中由 Proxy 对象完成实际类的接口调用,而在 Proxy 中则定义了一系列的额外操作。这是最简单的 Spring 中最简单的 AOP 实现,下文将以 org.springframework.aop.framework.ProxyFactoryBean
为例来分析对应的源代码。
org.springframework.aop.framework.ProxyFactoryBean
包含的相关属性:
public class ProxyFactoryBean extends ProxyCreatorSupport
implements FactoryBean