Spring Aop(十二)——编程式的创建Aop代理之AspectjProxyFactory
来源:互联网 发布:retrofit源码分析 编辑:程序博客网 时间:2024/05/17 20:35
编程式的创建Aop代理之AspectjProxyFactory
之前已经介绍了一款编程式的创建Aop代理的工厂——ProxyFactory
,其实ProxyFactory
拥有的功能AspectjProxyFactory
都有。它们虽然没有直接的继承关系,但是它们都继承自ProxyCreatorSupport
,而创建代理对象的核心逻辑都是在ProxyCreatorSupport
中实现的。所以说ProxyFactory
拥有的功能AspectjProxyFactory
都有。那么AspectjProxyFactory
与ProxyFactory
相比有什么不同呢? AspectjProxyFactory
的特殊之处就在于其可以直接指定需要创建的代理对象需要绑定的切面。在使用ProxyFactory
时,我们能够绑定的是Advisor
或Advice
,但是如果我们的程序中已经有了现成的切面类定义且能够为我们新创建的代理类使用时,我们还要为了ProxyFactory
建立代理对象的需要创建对应的Advisor
类、Advice
类和Pointcut
类定义,这无疑是非常麻烦的。AspectjProxyFactory
通常用于创建基于Aspectj风格的Aop代理对象。现假设我们有如下这样一个切面类定义。
@Aspectpublic class MyAspect { @Pointcut("execution(* add(..))") private void beforeAdd() {} @Before("beforeAdd()") public void before1() { System.out.println("-----------before-----------"); }}
在上述切面类定义中我们定义了一个Advisor
,其对应了一个BeforeAdvice
,实际上是一个AspectJMethodBeforeAdvice
,该Advice
对应的是上面的before1()
方法,还对应了一个Pointcut
,实际上是一个AspectJExpressionPointcut
。该Advisor
的语义就是调用所有的方法名为“add”的方法时都将在调用前调用MyAspect.before1()
方法。如果我们现在需要创建一个代理对象,其需要绑定的Advisor
逻辑跟上面定义的切面类中定义的Advisor
类似。则我们可以进行如下编程。
@Testpublic void testAspectJProxyFactory() { MyService myService = new MyService(); AspectJProxyFactory proxyFactory = new AspectJProxyFactory(myService); proxyFactory.addAspect(MyAspect.class); proxyFactory.setProxyTargetClass(true);//是否需要使用CGLIB代理 MyService proxy = proxyFactory.getProxy(); proxy.add();}
在上述代码中我们AspectjProxyFactory
在创建代理对象时需要使用的切面类(其实addAspect还有一个重载的方法可以指定一个切面类的对象),其实在AspectjProxyFactory
内部还是解析了该切面类中包含的所有的Advisor
,然后把能够匹配当前代理对象类的Advisor
与创建的代理对象绑定了。有兴趣的读者可以查看一下AspectjProxyFactory
的源码,以下是部分核心代码。
public void addAspect(Class<?> aspectClass) { String aspectName = aspectClass.getName(); AspectMetadata am = createAspectMetadata(aspectClass, aspectName); MetadataAwareAspectInstanceFactory instanceFactory = createAspectInstanceFactory(am, aspectClass, aspectName); addAdvisorsFromAspectInstanceFactory(instanceFactory);}private void addAdvisorsFromAspectInstanceFactory(MetadataAwareAspectInstanceFactory instanceFactory) { List<Advisor> advisors = this.aspectFactory.getAdvisors(instanceFactory); advisors = AopUtils.findAdvisorsThatCanApply(advisors, getTargetClass()); AspectJProxyUtils.makeAdvisorChainAspectJCapableIfNecessary(advisors); OrderComparator.sort(advisors); addAdvisors(advisors);}
需要注意的是在使用
AspectjProxyFactory
基于切面类创建代理对象时,我们指定的切面类上必须包含@Aspect注解。
另外需要注意的是虽然我们自己通过编程的方式可以通过AspectjProxyFactory
创建基于@Aspect
标注的切面类的代理,但是通过配置<aop:aspectj-autoproxy/>
使用基于注解的Aspectj风格的Aop时,Spring内部不是通过AspectjProxyFactory
创建的代理对象,而是通过ProxyFactory
。有兴趣的朋友可以查看一下AnnotationAwareAspectjAutoProxyCreator
的源代码。
(注:本文是基于Spring4.1.0所写,Elim写于2017年5月9日)
- Spring Aop(十二)——编程式的创建Aop代理之AspectjProxyFactory
- Spring Aop(十一)—— 编程式的创建Aop代理之ProxyFactory
- Spring Aop(十)——编程式的Pointcut
- Spring Aop(十六)——编程式的自定义Advisor
- 编程式实现Spring AOP
- 《Spring技术内幕》学习笔记9——AOP通知以及编程式AOP
- 《Spring技术内幕》学习笔记9——AOP通知以及编程式AOP
- 《Spring技术内幕》学习笔记9——AOP通知以及编程式AOP
- Spring Aop(十四)——Aop自动创建代理对象的原理
- Spring Aop(十三)——ProxyFactoryBean创建代理对象
- Spring源码阅读(七)—AOP创建代理
- Spring框架学习【AOP通知以及编程式AOP 】
- spring技术内幕9-AOP通知以及编程式AOP
- Spring源码分析----AOP通知以及编程式AOP
- spring aop 创建代理
- Spring源码之创建AOP代理
- Spring-AOP 自动创建代理之BeanNameAutoProxyCreator
- Spring-AOP 自动创建代理之DefaultAdvisorAutoProxyCreator
- 会让你耳朵怀孕的Hi-Fi神器 vivo Xplay5领衔
- 腾讯丁珂:大数据激励患者自我管理
- poj 1486 Sorting Slides(二分图匹配)
- 腾讯公司副总裁钟翔平:在技术端推进H5生态发展
- 阿里借UC“赋能”内容生产者:媒体要有做“天猫”的准备和机会
- Spring Aop(十二)——编程式的创建Aop代理之AspectjProxyFactory
- STM32中断优先级彻底讲解
- 面向对象
- 单旋翼无人机与遥控直升机有区别吗?
- “贴心多合一”的智能皮肤贴片,或许是体征监测的未来
- 带机器人一起上电视 人工智能先行者吴义坚做客东方卫视《新生代》
- Android更改默认menu界面颜色和位置
- 腾讯发布领御守护计划,或将带来行业两大改变
- 音乐猫狂欢夜!DOSS携天猫发布跨界智能新品