手寫 xxx-spring-boot-starter (一.自動裝載原理)

 

  1. 版本spring boot 2.1.0.RELEASE

  2. spring-boot啓動

    spring boot 的啓動時基於加@SpringBootApplication的主類啓動的

  3. 我們看一下@SpringBootApplication的具體信息

    我們看一這個註解的主要的註解

    @Target    ElementType.TYPE註解的作用目標 類/接口/枚舉/註解

    @Retention  RetentionPolicy.RUNTIME   會保留到class中,並在JVM加載class文件後仍然存在

    @EnableAutoConfiguration    開啓自動配置(spring boot 自動配置的關鍵)

  4. @EnableAutoConfiguration   

    @Import 注入了AutoConfigurationImportSelector,並通過這個類去選擇注入那些組件

    @AutoConfigurationPackage   自動配置包

  5. AutoConfigurationImportSelector是如何導入組件的呢?

     

    在100行獲取了自動配置項 AutoConfigurationEntry 調用的是getAutoConfigurationEntry方法

    我們看一這個方法

     

    返回的數據是new出來的,配置項是第一個構造參數,參數來源於119行的String集合 從getCandidateConfigurations方法獲取

     

     

    進一步進入loadFactoryNames

     

     

    進入LoadSpringFactories

     

     

    133行獲取工廠源 FACTORIES_RESOURCE_LOCATION 

     

    public static final String FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories";

     

    哦,原來在這裏

    這是掃描了spring.factories

     

     

    136行開始解析讀取到的東西

    解釋一下爲什麼使用LinkedMultiValueMap

    LinkedMultiValueMap的特性是一個key可以對應多個value

    LinkedMultiValueMap.add("key","value1");

    LinkedMultiValueMap.add("key","value2");

    LinkedMultiValueMap.add("key","value3");

    key[value1,value2,value3]

    這時我們已經找到我們需要加載的組件了

    那我們如何加載呢?

  6. 我們以DataSourceAutoConfiguration爲例

     

    @Configuration  裝載標識

    @ConditionalOnClass 實例化這個bean

    @EnableConfigurationProperties 開啓配置文件的屬性裝載讀取項目的application.yml進行裝載

    @Import  將依賴的Bean導入當前容器

    這樣一個數據源就裝載完畢了,我們就有了DataSource

     

 

發佈了9 篇原創文章 · 獲贊 2 · 訪問量 3737
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章