<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      spring詳解-bean生命周期

      Bean生命周期

      在經過三篇文章的分析過后,我們對Spring容器的創建過程有了一個大致的認識:

      文章一:

      SpringBoot啟動run方法分析: https://blog.csdn.net/okok__TXF/article/details/147009731

      SpringBoot-run方法分析

      文章二:

      Spring分析-IOC:https://blog.csdn.net/okok__TXF/article/details/147285599

      SpringIOC容器創建

      文章三:

      Spring分析-AOP:https://blog.csdn.net/okok__TXF/article/details/147397816

      Spring分析-AOP

      我們都知道是在refresh()方法里面進行的,本文就來對Bean的生命周期作一個總結,本文就不探討具體源碼了。

      1.bean工廠的后處理器

      invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory)

      通過對該方法的源碼查看調試,我們得知invokeBeanFactoryPostProcessors方法會把所有實現BeanFactoryPostProcessor和BeanDefinitionRegistryPostProcessor的類進行實例化和調用

      BeanDefinitionRegistryPostProcessor :: postProcessBeanDefinitionRegistry()方法:所有常規 bean 定義都已加載,但尚未實例化任何 bean。這允許在下一個后處理階段開始之前添加更多的 bean 定義。也就是說可以增加額外的BeanDefinition。

      BeanFactoryPostProcessor :: postProcessBeanFactory()方法:所有 bean 定義都已加載,但尚未實例化任何 bean。這允許覆蓋或添加屬性,甚至允許預先初始化 bean。也就是說可以修改BeanDefinition。

      對上面兩個有了這些認識,很顯然就可以知道BeanDefinitionRegistryPostProcessor是先于BeanFactoryPostProcessor 一步執行的。

      2.實例化單例

      finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory)

      這個里面我們也是非常有映象了,在AbstractAutowireCapableBeanFactory :: createBean(xx)方法里面:

      首先,實例化instanceWrapper = createBeanInstance(beanName, mbd, args);

      然后,對指定 bean 的給定合并 bean 定義進行后處理,applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);,這個就是執行MergedBeanDefinitionPostProcessor :: postProcessMergedBeanDefinition(xxx)方法了;

      其次,屬性填充populateBean(beanName, mbd, instanceWrapper); 在這個屬性填充里面

      //1.給任何 InstantiationAwareBeanPostProcessors 修改 Bean 狀態的機會。
      //具體是在屬性填充之前。Spring 容器會遍歷所有注冊的 InstantiationAwareBeanPostProcessor,
      //依次調用它們的 postProcessAfterInstantiation 方法。如果任何一個處理器返回 false,
      //則后續的屬性填充操作(包括依賴注入和屬性設置)將被跳過
      InstantiationAwareBeanPostProcessor :: postProcessAfterInstantiation()
      
      // 2.postProcessProperties
      // 例如:字段注入 AutowiredAnnotationBeanPostProcessor 
      // 處理帶有 @Autowired 和 @Value 注解的字段,根據相應的規則進行依賴注入 --- metadata.inject
      InstantiationAwareBeanPostProcessor :: postProcessProperties()
      

      最后,執行初始化exposedObject = initializeBean(beanName, exposedObject, mbd);

      //1.先后順序:BeanNameAware;BeanClassLoaderAware;BeanFactoryAware
      invokeAwareMethods(beanName, bean);
      //2.Bean初始化前置處理 【@PostConstruct -- CommonAnnotationBeanPostProcessor】
      BeanPostProcessor :: postProcessBeforeInitialization();
      //3.初始化
      /*
      InitializingBean :: afterPropertiesSet()
      initMethod
      */
      invokeInitMethods(beanName, wrappedBean, mbd);
      //4.Bean初始化后置處理【例如:生成aop代理對象】
      BeanPostProcessor :: postProcessAfterInitialization
      

      大致就是上述四步了。

      3.銷毀bean

      按照先后順序:

      • @PreDestroy 注解方法
      • DisposableBean#destroy()
      • 自定義 destroy-method
      @Component
      public class DestoryBeanDemo implements DisposableBean {
          @Override
          public void destroy() throws Exception {
              System.out.println("【DisposableBean 接口】 銷毀");
          }
      
          @PreDestroy
          public void preDestroy(){
              System.out.println("【@PreDestroy 注解】 銷毀");
          }
      }
      

      執行容器關閉的時候,走這里

      public void destroy() {
          if (!CollectionUtils.isEmpty(this.beanPostProcessors)) {
              for (DestructionAwareBeanPostProcessor processor : this.beanPostProcessors) {
                  // 1.@PreDestroy 注解方法
                  processor.postProcessBeforeDestruction(this.bean, this.beanName);
              }
          }
      
          ...
          //2.DisposableBean接口
          ((DisposableBean) this.bean).destroy();
          ....
          //3.自定義 destroy-method
          invokeCustomDestroyMethod
      }
      

      end. contact

      博客園:http://www.rzrgm.cn/jackjavacpp

      微信公眾號:

      posted @ 2025-04-22 20:07  別來無恙?  閱讀(397)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 国产在线观看播放av| 广东少妇大战黑人34厘米视频| 国产午夜福利视频在线| 免费无码中文字幕A级毛片| 内射干少妇亚洲69XXX| 国产丰满麻豆videossexhd| 久久精品国产91久久麻豆| 久久亚洲国产精品久久| 国产91精品一区二区蜜臀| 这里只有精品免费视频| 老子午夜精品888无码不卡 | 韩国美女福利视频一区二区| 合肥市| 中文字幕av一区二区| 国产精品黑色丝袜在线观看| 日韩视频一区二区三区视频| 欧美一性一乱一交一视频| 亚洲熟女一区二区av| 精品亚洲女同一区二区| 精品一卡2卡三卡4卡乱码精品视频| 亚洲高潮喷水无码AV电影| 亚洲天堂激情av在线| 91老熟女老人国产老太| av午夜久久蜜桃传媒软件| 日韩av一区二区高清不卡| 色香欲天天影视综合网| 另类 专区 欧美 制服| 亚洲最大的成人网站| 国产无遮挡吃胸膜奶免费看| 中文字幕国产精品一区二| 成人午夜福利免费专区无码| 亚洲综合不卡一区二区三区| 永久天堂网 av手机版| 国产偷国产偷亚洲高清人| 亚洲午夜福利AV一区二区无码| 国产精品av中文字幕| 亚洲人成人网站色www| 免费a级毛片18以上观看精品| 午夜免费无码福利视频麻豆| 日韩精品一区二区在线看| 男受被做哭激烈娇喘gv视频|