Spring-AOP 自动创建代理
导读
Spring-AOP 自动创建代理之BeanNameAutoProxyCreator
Spring-AOP 自动创建代理之DefaultAdvisorAutoProxyCreator
Spring-AOP 自动创建代理之AnnotationAwareAspectJAutoProxyCreator
概述
我们通过前面几篇博文的案例,我们会发现都是通过ProxyFactoryBean创建织入切面的代理,每个需要被代理的Bean都需要使用一个ProxyFactoryBean进行配置。
幸好Spring提供了自动代理机制,让容器自动生成代理,把开发人员从繁琐的配置中解脱出来。在内部,Spring使用BeanPostProcessor自动完成这项工作
实现类介绍
基于BeanPostProcessor的自动代理创建器的实现类,将根据一些规则自动在容器实例化Bean时为匹配的Bean生成代理内容。
这些代理创建器可以分为3类
基于Bean配置名规则的自动代理创建器
允许为一组特定配置名的Bean自动创建代理实例的代理创建器,实现类为BeanNameAutoProxyCreator基于Advisor匹配机制的自动代理创建器
它会对容器中所有的Advisor进行扫描,自动将这些切面应用到匹配的Bean中(为目标Bean创建代理实例),实现类为DefaultAdvisorAutoProxyCreator基于Bean中的AspectJ注解标签的自动代理创建器
为包含AspectJ注解的Bean自动创建代理实例,实现类为AnnotationAwareAspectJAutoProxyCreator.
自动创建代理器实现类的继承图
可以清楚的看到所有的自动代理器类都实现了BeanPostPorcessor,在容器实例化Bean时,BeanPostProcessor将对它进行加工处理,所以自动代理创建器有机会对满足匹配规则的bean自动创建代理对象
BeanNameAutoProxyCreator
请参考另外一篇博文 Spring-AOP 自动创建代理之BeanNameAutoProxyCreator
DefaultAdvisorAutoProxyCreator
请参考另外一篇博文 Spring-AOP 自动创建代理之DefaultAdvisorAutoProxyCreator
AnnotationAwareAspectJAutoProxyCreator
请参考另外一篇博文 Spring-AOP 自动创建代理之AnnotationAwareAspectJAutoProxyCreator
AOP总结
AOP是OOP的延伸,它为程序开发提供了一个崭新的思考角度,将可以重复性的横切逻辑抽取到统一的模块中,通过OOP的纵向抽象和AOP的横向抽取,程序才可以真正解决重复性代码问题。
Spring采用JDK动态代理和CGLib动态代理技术在运行期织入增强,所以不需要装备特殊的编译器或类装载器就可以使用AOP功能。
要使用JDK动态代理,目标类必须实现接口,而CGLib不对目标类作任何限制,它通过动态生成目标类子类的方式提供代理。
在JDK动态代理中通过接口来实现方法拦截,所以必须确保要拦截的目标在接口中有定义,否则将无法拦截
在CGLib动态代理中通过动态生成代理子类来实现方法拦截,所以必须确保要拦截的目标方法可以被子类访问,也就是目标方法必须定义为非final,且非私有实例方法。
JDK在创建代理对象时的性能高于CGLib,而生成的代理对象的运行性能却比CGLib低。 如果是singleton的代理,推荐使用CGlib动态代理。
Spring只能在方法级别上织入增强,Spring提供了4种类型的方法增强,分别是前置增强、后置增强、环绕增强、异常抛出增强,此外还有一种特殊的引介增强。 引介增强是类级别的,它为目标类织入新的接口实现。 从广义上将,增强其实是一种最简单的切面,它既包括横切代码又包括切点信息,只不过它的切点只是简单的方法相对位置信息。 所以增强一般需要和切点联合才可以表示一个更具实用性的切面。
在Spring中,普通的切点通过目标类名和方法名描述连接点的信息。 流程切点是比较特殊的切点,它通过方法调用堆栈的运行环境来决定连接点。 有时候需要通过切点的交叉或者合并描述一个最终的切点,可以使用ComposablePointcut的复合切点
切面是增强和切点的联合体,可以很方便的通过Spring提供的ProxyFactoryBean将切面自入不同的目标类中。 当然为每个目标类手工配置一个切面是比较繁琐的,Spring利用BeanPostProcessor可干涉Bean生命周期的机制,提供一些可以自动创建代理、自入切面的自动代理创建器,其中DefaultAdvisorAutoProxyCreator是功能强大的自动代理穿件器,它可以将容器中所有的Advisor自动织入目标Bean中。
文章来源: artisan.blog.csdn.net,作者:小小工匠,版权归原作者所有,如需转载,请联系作者。
原文链接:artisan.blog.csdn.net/article/details/77448420
- 点赞
- 收藏
- 关注作者
评论(0)