zoukankan      html  css  js  c++  java
  • Spring——AOP原理及源码三【系列完】

    回顾  

    上一篇中,我们创建并在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(),如下图

       第四步经历了:

      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方法。方法尝试返回一个代理对象,用来代替我们的目标实例。

    下一篇中,我们将探究后置处理器的方法,探究究竟是如何给实例创建代理对象。

     

  • 相关阅读:
    P2801 教主的魔法 (分块)
    BZOJ_1614_ [Usaco2007_Jan]_Telephone_Lines_架设电话线_(二分+最短路_Dijkstra/Spfa)
    BZOJ_1601_[Usaco2008_Oct]_灌水_(最小生成树_Kruskal)
    BZOJ_1612_[Usaco2008_Jan]_Cow_Contest_奶牛的比赛_(dfs)
    BZOJ_1833_[ZJOI2010]_数字计数_(数位dp)
    BZOJ_1026_[SCOI2009]_windy数_(数位dp)
    BZOJ_4326_[NOIP2015]_运输计划_(二分+LCA_树链剖分/Tarjan+差分)
    BZOJ_2194_快速傅立叶之二_(FFT+卷积)
    BZOJ_1615_[Usaco2008_Mar]_The Loathesome_Hay Baler_麻烦的干草打包机_(模拟+宽搜/深搜)
    BZOJ_1626_[Usaco2007_Dec]_Building_Roads_修建道路_(Kruskal)
  • 原文地址:https://www.cnblogs.com/Unicron/p/12431019.html
Copyright © 2011-2022 走看看