<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          spring-boot源碼分析之BeanFactory · 叁

          共 2018字,需瀏覽 5分鐘

           ·

          2021-09-12 22:02

          前言

          今天我們繼續(xù)研究BeanFactory,不過今天分享的內(nèi)容有點零散,主要包括三個方面的內(nèi)容,一個是ApplicationContextInitializer的初始化,這個嚴格來說和BeanFactory沒什么關系,但是源碼也分析了,所以這里提一下;另一個是ignoredDependencyInterfaces,這個是BeanFactory的一個核心屬性,用于屏蔽我們不需要進行依賴檢查和自動注入的接口;最后一個是beanDefinitionMap,這一次我們找到了它最開始初始化的代碼,所以這里一起分享下。

          BeanFactory初始化過程

          ApplicationContextInitializer初始化

          下面是ApplicationContextInitializer的初始化操作,ApplicationContextInitializerspring boot提供的一套初始化機制,它的initialize方法在spring boot容器刷新前執(zhí)行,通常被用來進行配置文件初始化,我們也可以自己定義自己的ApplicationContextInitializer,后面我們可以做一期demo示例。

          ApplicationContextInitializer的初始化操作是在 prepareContext方法中被執(zhí)行的,默認情況下,會有7ApplicationContextInitializer被執(zhí)行

          下面是第一個ApplicationContextInitializer的方法源碼其他類似,需要注意的是ApplicationContextInitializer本身是順序的,而且方法內(nèi)部也有排序操作:

          在第二個ApplicationContextInitializer初始化方法內(nèi)容,它往容器中注冊了BeanFactory的后置處理器

          回到容器初始化開始的地方

          根據(jù)下面的截圖,我們可以看出來,beanFactory其實在容器創(chuàng)建完成后,已經(jīng)完成了一部分初始化操作,所以想要搞清楚beanFactroy的初始,必須要回到beanFactory初始化的地方。

          發(fā)現(xiàn)ignoredDependencyInterfaces

          ignoredDependencyInterfacesBeanFactory的一個核心屬性,用于屏蔽我們不需要進行依賴檢查和自動注入的接口,下面是BeanFactory初始化ignoredDependencyInterfaces的代碼,這段代碼也是在創(chuàng)建容器的時候被執(zhí)行的。

          ignoredDependencyInterfaces存放的是需要忽略的依賴接口,默認情況下只會加入BeanFactoryAware的接口,根據(jù)官方解釋,加入ignoredDependencyInterfaces中的接口,會忽略依賴檢查,并且不會被autowire

          找到beanDefinitionMap初始化開始的地方

          下面是beanDefinitionMap最開始初始化的代碼,我們可以看到,在執(zhí)行完registry.registerBeanSefinition方法之后,第一個beandefinition信息被成功注冊。

          下面是registerAnnotationConfigProcessors方法的完整截圖:

          這個方法在AnnotationConfigUtils這個類中,它是在實例化AnnotationConfigServletWebServerApplicationContextreader屬性的時候被執(zhí)行的。

          這個方法的作用是注冊給定的注解后置處理器,從包名上我們可以看出來,這五個類有兩個是和事件監(jiān)聽器相關的,有三個是和注解相關的,其中還有一個類沒有被注入,是和jpa相關的組件,應該和我們沒有引入jpa的依賴和配置有關系。關于beanDefinitionMap我們暫時就先說這么多,至于這五個最先被注冊的元老級類,我們后面再來詳細了解。

          總結(jié)

          spring boot的源碼真的太上頭了,這些內(nèi)容本來是中午要輸出的,但是由于早上沒有太多進展,最后連圖都沒畫好,然后中午也沒有理出內(nèi)容,一直等到下班回到家,才開始真正干活,所以今天的絕大多數(shù)內(nèi)容都是晚上回到家才搞出來的。嚴格來說,最近這幾天都是如此,但是經(jīng)過我最近這段時間的梳理和硬啃,現(xiàn)在感覺多少有點眉目了,自我感覺關于run方法我已經(jīng)梳理完40%~50%的內(nèi)容,剩下reflush方法大概能占到30%的內(nèi)容,事件監(jiān)聽相關內(nèi)容大概占比20%,反正感覺慢慢能看見勝利的曙光了……加油吧,沒有別的選擇了~

          好了,各位小伙伴晚安!

          - END -


          瀏覽 29
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  久久性AV | 婷婷六月激情 | 人人操超碰 | 天天干天天射天天射 | 国产一级片哪里可以看 |