spring——AOP原理及源码(三)

  上一篇中,咱们建立并在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(),以下图

   第四步经历了:

    1.   getBean
    2.   doGetBean
    3.   getSingleton
    4.   getObject
    5.   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方法。方法尝试返回一个代理对象,用来代替咱们的目标实例。

 

在下一篇中,咱们将探究后置处理器的方法,探究到底是如何给实例建立代理对象。

相关文章
相关标签/搜索