至此AOP的基本使用和概念相信大家都有一定的了解,下面开始从源码入手,去探索整个Spring AOP的实现 。
源码分析
上面的例子之所以能完成AOP的代理,只因为Spring的xml配置里面加了这一句
< aop : aspectj-autoproxy / >
加上了这一个配置,使得整个Spring项目拥有了AOP的功能 。全局搜索下aspectj-autoproxy这个字段,可以发现,是这个类AspectJAutoProxyBeanDefinitionParser解析了这个元素 。
其中的parse方法调用的是AopNamespaceUtils类中的registerAspectJAnnotationAutoProxyCreatorIfNecessary 。这个方法作用是初始化一个AOP专用的Bean,并且注册到Spring容器中 。
解析这三个操作,
第一句,注册一个AnnotationAwareAspectJAutoProxyCreator(称它为自动代理器),这个Creator是AOP的操作核心,也是扫描Bean,代理Bean的操作所在 。第二句,解析配置元素,决定代理的模式 。其中有JDK动态代理,还有CGLIB代理,这部分后续会再细讲 。第三句,作为系统组件,把Creator这个Bean,放到Spring容器中 。让Spring实例化,启动这个Creator 。自动代理器
下面我们来细看AnnotationAwareAspectJAutoProxyCreator是怎么对Bean做AOP的 。
AnnotationAwareAspectJAutoProxyCreator的父类AbstractAutoProxyCreator,里面实现了BeanPostProceesor接口的postProcessAfterInitialization方法(该方法在一个Bean加载到Spring后会执行) 。
关联注释描述可知,当一个bean加载完后,执行了该方法,会生成一个新的代理对象,返回context中加载 。
下面重点看其中的wrapIfNecessary方法 。讲述了整个AOP的核心流程,是Spring AOP最最最核心的代码所在 。
看到红框的两个核心方法,可以知道,先从刚加载的Bean中扫描出所有的advice和advisor,然后用它来创建一个代理对象 。
获取Advisor
先看如何扫描出advice和advisor 。一步步Debug getAdvicesAndAdvisorsForBean(),找到BeanFactoryAspectJAdvisorsBuilder中的buildAspectJAdvisors方法 。
该方法就是找出Spring容器中存在的AspectBean,然后返回所有AspectBean中的Advisor 。
示例中,LogAspect就是AspectBean,然后LogAspect中的before和after方法就是Advisor 。所以最终返回了LogAspect中的Advisor(before和after) 。
创建代理
拿到了所有的Advisor后,就进入了创建代理的流程了createProxy() 。
这些入参,对比上一篇讲过的动态代理,其实非常相似 。
下面来具体看下代理的过程
代码可以概括为,创建一个proxyFactory对象,然后把上面的参数都丢到这个这个工厂里,最后从proxyFactory获取一个代理对象 。
来看看ProxyFactory的getProxy方法是怎么生成代理对象的 。
Debug该方法,可以在DefaultAopProxyFactory中createAopProxy看到
以上关于本文的内容,仅作参考!温馨提示:如遇专业性较强的问题(如:疾病、健康、理财等),还请咨询专业人士给予相关指导!
「辽宁龙网」www.liaoninglong.com小编还为您精选了以下内容,希望对您有所帮助:- 秋冬值得入手的5条裤子,时尚又好看!
- 秋天买裤子,从这3个挑选思路入手,高级又显腿细,小腿粗也能穿
- 《末日重生》向往末日重生
- 哲学是从现实出发又为现实服务并不断发展的,是吗?
- 没有背景,长相普通!62岁南京阿姨从流水线女工,靠穿搭变成网红
- 从八字来看什么样的人容易有才无德
- 从八字命理谈肠胃不好的原因到底是什么
- 老实人为什么从来不求人?
- 中国最新的空对空导弹是什么?
- 被这个“中年姐姐”美到,秋冬穿大衣从不配无痕裤,更优雅有气质