<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 · 貳

          共 2341字,需瀏覽 5分鐘

           ·

          2021-09-06 15:37

          前言

          BeanFactoryspring boot最重要的核心組件,當然也是spring boot非常基礎的組件,所以梳理清楚BeanFactory的源碼才是梳理清楚Spring boot源碼的關鍵。前天,我們分享了beanDefinitionNamesbeanDefinitionMap的初始化過程,雖然過程中有涉及到beanFactory的相關知識點,但是關于beanFactroy我們還沒有正式地分析過它,關于它的初始化過程,也是一無所知,為了更系統(tǒng)地了解beanFactory,從今天開始我們開始更系統(tǒng)地分析beanFactory的相關源碼,下面我們就先來看下BeanFactory的初始化過程。

          BeanFactory初始化

          今天我們依然是從一張時序圖開始講起,下面這張時序圖就是spring boot容器的BeanFactory初始化過程,beanFactory初始化其實是和容器的初始化同時完成的,它也是容器初始化過程中的重要一步:

          在上面的時序圖中,最關鍵的內(nèi)容就是AnnotationConfigServletWebServerApplicationContext的實例化過程,這里面涉及到java類的初始化流程:創(chuàng)建子類時,必須先調(diào)用父類無參構造方法,所以AnnotationConfigServletWebServerApplicationContext是在所有父類實例化完成后,才完成它自己的實例化過程的。下面我們就來看AnnotationConfigServletWebServerApplicationContext的初始化流程。

          createApplicationContext

          debug的過程中,我發(fā)現(xiàn) BeanFactory在容器被創(chuàng)建后就已經(jīng)被初始化,這也就是說BeanFactory其實是在spring boot容器創(chuàng)建過程中被初始化的,所以我們今天主要就是研究容器創(chuàng)建過程,也就是createApplicationContext()方法:

          關于createApplicationContext這個方法,我們前面已經(jīng)展示過了,它的作用就是通過反射創(chuàng)建容器實例:

          AnnotationConfigServletWebServerApplicationContext實例化

          通過跟蹤代碼,最終可以確認,調(diào)用的是AnnotationConfigServletWebServerApplicationContext無參構造方法:

          所以下面就是對AnnotationConfigServletWebServerApplicationContext的實例化,由于容器這塊繼承關系比較復雜,所以實例化順序也比較復雜。

          容器實例化

          雖然各位小伙伴可能很清楚java對象實例化過程,但是我覺得還是有必要再補充說明下。在有繼承關系的java對象實例化過程中,如果當前類繼承了父類,在實例化當前類時,先要調(diào)用父類的無參構造方法(就算不指定,也會隱式調(diào)用)。所以,在這里初始AnnotationConfigServletWebServerApplicationContext時,會先調(diào)用它的父類無參構造方法,下面是AnnotationConfigServletWebServerApplicationContext的繼承關系,看起來確實很復雜:

          在跟蹤代碼的過程中,最終我確認BeanFactory是在GenericApplicationContext的無參構造方法中完成初始化的,也就是AnnotationConfigServletWebServerApplicationContext父類的父類的父類:

          所以初始化的過程就是,AnnotationConfigServletWebServerApplicationContext的無參構造方法中先調(diào)用ServletWebServerApplicationContext的無參構造方法,ServletWebServerApplicationContext的無參構造方法中先調(diào)用GenericWebApplicationContext的無參構造方法,GenericWebApplicationContext的無參構造方法先調(diào)用GenericApplicationContext的無參構造方法(無限套娃)……

          知識擴展

          后續(xù)的調(diào)用這里就直接省略了,因為他們和BeanFactory沒有關系,而且因為繼承關系過于復雜,所以這里我們要盡可能簡單。在這里所有的初始化操作中,調(diào)用父類構造方法始終是首先被執(zhí)行的,也必須首先被執(zhí)行(首先調(diào)用父類的無參構造方法),這也就是為什么我們在寫類的有參構造方法的時候,如果父類沒有無參構造方法時,必須顯式調(diào)用父類有參構造方法,且必須放在第一行的原因:

          總結

          截止到今天,我們已經(jīng)梳理清楚beanFactory的兩塊內(nèi)容,一個是beanDefinitionNamesbeanDefinitionMap,他們都是beanFactory的核心屬性,另一塊就是我們今天的BeanFactory的初始化,下一步應該還是會進一步深挖beanFactory的相關知識點,因為從一開始我的想法就是要找到spring boot包掃描和實例化bean的相關邏輯,但到目前為止還沒有理清楚這一塊的邏輯和流程,不過我相信很快我們就能完成這個目標了,因為我們的每一步都在更靠近目標……

          - 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>
                  丝袜脚丫丁香五月 | 成人啪啪视频在线 | 欧美三级电影在线播放 | www.操逼操逼 | 成人在线观看网站 |