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

肥朝發表於2019-03-05

前言

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

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

如果要入門看原始碼,我認為最合適的就是MybatisSpringBoot,理由如下:

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

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

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

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

直入主題

說到SpringBoot,最先想到的往往是做了大量的自動配置.常見的自動配置有兩種方式

1.@EnableXXX

比如@EnableCaching

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

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

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了,更多的時候是想要你完成全套操作.那麼我們就來講講,這個自動配置是怎麼做的

圖解原始碼

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

簡單文字解說:

首先要知識普遍一下,比如我圖中紅色框起來的是什麼意思呢?那麼首先你就要了解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中,從而建立了自動配置類,根據自動配置類中的邏輯,進行相應的自動配置

寫在最後

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

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

相關文章