在上一篇中,咱们建立并在BeanFactory中注册了AnnotationAwareAspectJAutoProxyCreator组件。本篇咱们将要探究,这个组件是在哪里以及什么时候发挥做用的。html
咱们直接开始调试,以前看过的断点就直接跳过了,一直跳到下一个断点直到来到 AbstractAutoProxyCreator.postProcessBeforeInstantiation()app
这个方法名叫postProcessBeforeInstantiation,仔细看会发现和后置处理器BeanPostProcessor是不同的,咱们拉到上面能看到AbstractAutoProxyCreator实现的是post
SmartInstantiationAwareBeanPostProcessor这个接口测试
进入SmartInstantiationAwareBeanPostProcessor这个接口会看到它又继承了InstantiationAwareBeanPostProcessorspa
再进入InstantiationAwareBeanPostProcessor能够看到它继承的也是BeanPostProcessor代理
但InstantiationAwareBeanPostProcessor实现的两个方法名字以下:调试
不一样于BeanPostProcessor中的postProcessBeforeInitialization和postProcessAfterInitializationhtm
可见后置处理器也是存在差别的。对象
结论:AnnotationAwareAspectJAutoProxyCreator是InstantiationAwareBeanPostProcessor类型的后置处理器blog
咱们仍是从头看起,看程序是怎么走到这一步的。
在Frames框中从测试方法开始,往上查看:
一、refresh刷新建立容器实例化剩下的全部单实例bean
二、finishBeanFactoryInitialization(beanFactory) 实例化剩下的全部单实例bean
三、再往上走,beanFactory调用了preInstantiateSingletons()
四、一直往上走直到AbstractAutowireCapableBeanFactory.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方法。方法尝试返回一个代理对象,用来代替咱们的目标实例。
在下一篇中,咱们将探究后置处理器的方法,探究到底是如何给实例建立代理对象。