zoukankan      html  css  js  c++  java
  • Spring的BeanPostProcessor后置处理器与bean的生命周期

    前言

        本文将把Spring在Bean的生命周期中涉及到的后置处理器一一梳理出来,并简要说一下功能,至于每个后置处理器在实际扩展中的用处,还要后续慢慢探索总结。

    正文

        下面一步步跟进探寻那些后置处理器们。首先进入AbstractApplicationContext类中的refresh方法,继续追踪至此模板方法中的finishBeanFactoryInitialization方法,然后点进beanFactory.preInstantiateSingletons()方法,进入DefaultListableBeanFactory类中,点进getBean方法,继续点击doGetBean方法,它是获取bean的核心方法,但我们只关注里面lambda表达式中的createBean方法,点之进入AbstractAutowireCapableBeanFactory#createBean方法,逐渐逼近无知兽。

    第一处

        在createBean方法的resolveBeforeInstantiation方法中,遇见第一处后置处理器的调用,而且一次调了两种,分别是:InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation和

    BeanPostProcessor.postProcessAfterInitialization。如下截图所示:

    此处如果before的方法返回的bean不为null, 方法返回之后在createBean方法中就不会往下走了(即后续的2-8处理器都不走)而是直接返回。

    额外说一下Spring的使用实例。如果bean中有切面类,那么会调用AbstractAutoProxyCreator#postProcessBeforeInstantiation中的实现逻辑,在此方法中将切面类加入advisedBeans中,这样后续切面会自动忽略对advisedBeans中对象的拦截。

    第二处

        进入createBean中的doCreateBean方法,在createBeanInstance方法中调用了determineConstructorsFromBeanPostProcessors方法,里面是第二处后置处理器的调用:SmartInstantiationAwareBeanPostProcessor.determineCandidateConstructors。截图如下所示,此处后置处理器用于推断构造方法,默认调用的实现类是AutowiredAnnotationBeanPostProcessor。

     第三处

        回到doCreateBean方法,继续往下看applyMergedBeanDefinitionPostProcessors方法,找到第三处后置处理器的调用:MergedBeanDefinitionPostProcessor.postProcessMergedBeanDefinition。截图如下所示:

     第四处

        在doCreateBean中继续往下找,getEarlyBeanReference方法中找到第四处调用:SmartInstantiationAwareBeanPostProcessor.getEarlyBeanReference。此处用于解决循环依赖,截图如下:

     第五处

        继续往下,进入populateBean方法,在此方法中有两处调用,第五处:InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation。返回布尔类型,用于判断是不是需要属性填充,如果返回false则直接从populateBean中返回,不再执行第6/7/8处。

     第六处

        第六处调用了两个方法:InstantiationAwareBeanPostProcessor.postProcessProperties和InstantiationAwareBeanPostProcessor.postProcessPropertyValues。此处用于做属性填充,截图如下:

     第七处

        回到doCreateBean中继续往下,进入initializeBean方法,此方法中也有两处调用,在applyBeanPostProcessorsBeforeInitialization中调用了第七处:BeanPostProcessor.postProcessBeforeInitialization。

    调用的是通常意义上BeanPostProcessor的before方法

     第八处

        在applyBeanPostProcessorsAfterInitialization中调用了第八处:BeanPostProcessor.postProcessAfterInitialization。调用的是通常意义上BeanPostProcessor的after方法

    Spring的切面就是基于此方法进行的,调用的实现方法是AbstractAutoProxyCreator#postProcessAfterInitialization。它会先将切面类放入advisedBeans中,标记为true,表示需要用切面拦截。然后调用AbstractAutoProxyCreator#createProxy方法生成代理。

    第九处

        第九处是在执行AbstractApplicationContext#close方法销毁bean时触发的,最终调用到的是DisposableBeanAdapter#destroy,在此方法中调用了:DestructionAwareBeanPostProcessor.postProcessBeforeDestruction。用于在销毁bean之前做操作。为什么DestructionAwareBeanPostProcessor中没有after方法?因为执行after的时候所有bean都没了,Spring认为你也没必要做什么扩展了。

    小结

        以上就是Spring的bean声明周期内经手的9处后置处理器调用,共涉及到5个接口,本文只是简要说明了其作用,其真实的使用场景很多,需要后续慢慢摸索。

  • 相关阅读:
    Odoo安装教程2-创建新的插件模块第一讲
    Odoo安装教程1-创建第一个 Odoo 应用
    Odoo开发教程21-Odoo服务器端开发者模式
    Ubuntu 安装LAMP
    Roundcube Webmail信息泄露漏洞(CVE-2015-5383)
    Roundcube Webmail跨站脚本漏洞(CVE-2015-5381 )
    Roundcube Webmail File Disclosure Vulnerability(CVE-2017-16651)
    Roundcube 1.2.2
    XAMPP重置MySQL密码
    python importlib动态导入模块
  • 原文地址:https://www.cnblogs.com/zzq6032010/p/11789076.html
Copyright © 2011-2022 走看看