Spring AOP的实现机制
Spring AOP属于第二代AOP,采用动态代理机制和字节码生成技术实现。动态代理模式和字节码生成都是在运行期间为目标对象生成一个代理对象,将横切逻辑织入到这个代理对象中,系统最终使用的是织入了横切逻辑的代理对象,而不是真正的目标对象。
1. 代理模式
Spring AOP本质上就是采用这种代理机制实现的,但是细节上有所不同。
这种方式的问题:针对不一样的目标对象类型,我们要为其单独实现一个代理对象。而实际上,这些代理对象所要添加的横切逻辑是一样的。当系统中存在成百上千的符合Pointcut匹配条件的目标对象时,我们就要为这成百上千的目标对象创建成百上千的代理对象…
2. 动态代理
使用该机制,我们可以为指定的接口在系统运行期间动态地生成代理对象,从而帮助我们走出最初使用静态代理实现AOP的窘境。
动态代理虽好,但不能满足所有的需求。因为动态代理机制只能对实现了相应Interface的类使用。
默认情况下,如果Spring AOP发现目标对象实现了相应Interface,则采用动态代理机制为其生成代理对象实例。而如果目标对象没有实现任何Interface,Spring AOP会尝试使用一个称为CGLIB(Code Generation Library)的开源的动态字节码生成类库,为目标对象生成动态的代理对象实例。
3. 动态字节码生成
使用动态字节码生成技术扩展对象行为的原理是,我们可以对目标对象进行继承扩展,为其生成相应的子类,而子类可以通过覆写来扩展父类行为,只要将横切逻辑的实现放到子类中,然后让系统使用扩展后的目标对象的子类,就可以达到与代理模式相同的效果了。