圖解源碼 | SpringBoot中自動配置原理

前言

最近一些朋友問到,以前的Dubbo源碼系列還會不會更新.答案是,後續會升級"Dubbo源碼解析系列-plus"版本.不要問我這個plus有多大,暫時還不會大到一隻手沒法掌控.java

除了以前的"源碼解析"和"源碼實戰"外,今年還會多一個專題,也就是圖解源碼的快餐式專題.以前發過一篇圖解源碼 | MyBatis的Mapper原理面試

若是要入門看源碼,我認爲最合適的就是MybatisSpringBoot,理由以下:spring

  1. 熱門.你和他們相處的時間甚至比和你女友相處的時間要長架構

  2. 主流程複雜度不大.猜透這兩個框架的原理和設計思路比猜對女孩子的心思簡直簡單太多了!app

  3. 面試要問.像if else這種"坦誠相待"的代碼面試根本沒人問,相反像SpringBoot這樣作了大量自動配置的"猶抱琵琶半遮面"的設計面試老是一上來就要把原理扒個精光.框架

直入主題

說到SpringBoot,最早想到的每每是作了大量的自動配置.常見的自動配置有兩種方式函數

1.@EnableXXXspa

好比@EnableCaching設計

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
//導入指定配置類
@Import(CachingConfigurationSelector.class)
public @interface EnableCaching {
	//...省略
}
複製代碼

這種的好處是,當你依賴某個starter時,能夠選擇是否開啓starter中幫你自動配置的一些設置.這個@EnableXXX從單詞上看,就知道有開關的意思code

2.META-INF/spring.factories

好比SpringBoot中默認的spring.factories

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\
org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\

//省略
複製代碼

這種的好處是,當你依賴某個starter時,自動幫你開啓starter中幫你自動配置的一些設置.

因爲我在公司作的是基礎架構這塊,因此這兩種我都有用到,固然第二種用得比較多,由於人家都依賴你的starter了,更多的時候是想要你完成全套操做.那麼咱們就來說講,這個自動配置是怎麼作的

圖解源碼

簡單文字解說:

首先要知識廣泛一下,好比我圖中紅色框起來的是什麼意思呢?那麼首先你就要了解ImportSelector是幹嗎的了

//自定義邏輯返回須要導入的組件
public class MyImportSelector implements ImportSelector {

    /** * @param importingClassMetadata 當前標註@Import註解的類的全部註解信息 * @return 導入到容器中的組件全類名 */
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        return new String[]{"com.toby.register.bean.Colour"};
    }
}
複製代碼

說白了就是把組件的全類名給我,我幫你初始化這個多個bean.和你在spring的xml中配置bean,是一個意思.區別就在於,這種方式可以在代碼運行中配置建立bean.因此咱們總結一下,這個自動配置的原理到底是怎麼樣的

1.啓動main函數,加載@SpringBootApplication

2.@SpringBootApplication會拿到META-INF/spring.factories中須要自動配置的類的全名

3.把自動配置的類全名放入ImportSelector中,從而建立了自動配置類,根據自動配置類中的邏輯,進行相應的自動配置

寫在最後

肥朝 是一個專一於 原理、源碼、開發技巧的技術公衆號,號內原創專題式源碼解析、真實場景源碼原理實戰(重點)。掃描下面二維碼關注肥朝,讓本該造火箭的你,再也不擰螺絲!

相關文章
相關標籤/搜索