spring——AOP原理及源码(三)
2020-03-06 16:11:22来源:博客园 阅读 ()
spring——AOP原理及源码(三)
在上一篇中,我们创建并在BeanFactory中注册了AnnotationAwareAspectJAutoProxyCreator组件。本篇我们将要探究,这个组件是在哪里以及何时发挥作用的。在上一篇中,我们创建并在BeanFactory中注册了AnnotationAwareAspectJAutoProxyCreator组件。本篇我们将要探究,这个组件是在哪里以及何时发挥作用的。
调试的起点
我们直接开始调试,之前看过的断点就直接跳过了,一直跳到下一个断点直到来到 AbstractAutoProxyCreator.postProcessBeforeInstantiation()
不同后置处理器的差异
这个方法名叫postProcessBeforeInstantiation,仔细看会发现和后置处理器BeanPostProcessor是不一样的,我们拉到上面能看到AbstractAutoProxyCreator实现的是
SmartInstantiationAwareBeanPostProcessor这个接口
进入SmartInstantiationAwareBeanPostProcessor这个接口会看到它又继承了InstantiationAwareBeanPostProcessor
再进入InstantiationAwareBeanPostProcessor可以看到它继承的也是BeanPostProcessor
但InstantiationAwareBeanPostProcessor实现的两个方法名字如下:
不同于BeanPostProcessor中的postProcessBeforeInitialization和postProcessAfterInitialization
可见后置处理器也是存在差异的。
结论:AnnotationAwareAspectJAutoProxyCreator是InstantiationAwareBeanPostProcessor类型的后置处理器
从头看起
我们还是从头看起,看程序是怎么走到这一步的。
在Frames框中从测试方法开始,往上查看:
1、refresh刷新创建容器实例化剩下的所有单实例bean
2、finishBeanFactoryInitialization(beanFactory) 实例化剩下的所有单实例bean
3、再往上走,beanFactory调用了preInstantiateSingletons()
4、一直往上走直到AbstractAutowireCapableBeanFactory.createBean(),如下图
第四步经历了:
- getBean
- doGetBean
- getSingleton
- getObject
- createBean
这一系列过程和上篇中创建AnnotationAwareAspectJAutoProxyCreator的过程是一模一样的,
不过上篇创建AnnotationAwareAspectJAutoProxyCreator时,我们经历上述过程后进入的是doCreateBean方法,最终创建出了bean
而在这里,我们执行的是在doCreateBean上面的resolveBeforeInstantiation方法
(这时AnnotationAwareAspectJAutoProxyCreator早已经创建好放入容器,我们现在做的是完成其他所有bean的实例化)
如下图,我们可以发现,当前的resolveBeforeInstantiation正是在doCreateBean方法的上面
说明当时也调用了resolveBeforeInstantiation方法,只不过返回的bean为null,所以才有了调用doCreateBean来创建bean
现在我们可以知道,在所有bean创建之前,都会先调用resolveBeforeInstantiation方法
方法上的注释表明,方法会给后置处理器一个机会来返回目标bean实例的代理对象。也就是返回一个代理对象来代替我们将要创建的的目标bean
现在我们把注意力放在resolveBeforeInstantiation这个方法上
在方法栈中继续往上查看,我们来到了resolveBeforeInstantiation方法的1011行
从1011到1013行,调用applyBeanPostProcessorsBeforeInstantiation返回bean,接着进行判断,如果返回的bean不为null
接着执行applyBeanPostProcessorsAfterInitialization方法
接下来我们先进入applyBeanPostProcessorsBeforeInstantiation方法,将会循环遍历所有的后置处理器
判断如果是InstantiationAwareBeanPostProcessor类型,就执行它的postProcessBeforeInstantiation方法
上面我们提到过后置处理器存在差异,我们的AnnotationAwareAspectJAutoProxyCreator刚好就是属于InstantiationAwareBeanPostProcessor这个类型
所以接下来我们来到当初设置的的后置处理器断点,并执行AnnotationAwareAspectJAutoProxyCreator的postProcessBeforeInstantiation方法
总结
由以上整个过程,我们可以得出:在所有bean实例化的时候,都会调用AnnotationAwareAspectJAutoProxyCreator的postProcessBeforeInstantiation方法。方法尝试返回一个代理对象,用来代替我们的目标实例。
在下一篇中,我们将探究后置处理器的方法,探究究竟是如何给实例创建代理对象。
原文链接:https://www.cnblogs.com/Unicron/p/12431019.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
下一篇:Redis
- Spring系列.ApplicationContext接口 2020-06-11
- springboot2配置JavaMelody与springMVC配置JavaMelody 2020-06-11
- 给你一份超详细 Spring Boot 知识清单 2020-06-11
- SpringBoot 2.3 整合最新版 ShardingJdbc + Druid + MyBatis 2020-06-11
- 掌握SpringBoot-2.3的容器探针:实战篇 2020-06-11
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash