SpringBoot自動配置原理

1、當(dāng)SpringBoot應(yīng)用啟動的時(shí)候,就從主方法里面進(jìn)行啟動的。

它主要加載了@SpringBootApplication注解主配置類,這個(gè)@SpringBootApplication注解主配置類里邊最主要的功能就是SpringBoot開啟了一個(gè)@EnableAutoConfiguration注解的自動配置功能。

2、@EnableAutoConfiguration作用:

它主要利用了一個(gè)EnableAutoConfigurationImportSelector選擇器給Spring容器中來導(dǎo)入一些組件。

3、那么導(dǎo)入了哪些組件呢?

我們來看EnableAutoConfigurationImportSelector這個(gè)類的父類selectImports。

類里面規(guī)定了一個(gè)方法叫selectImports這個(gè)方法,查看了selectImports這個(gè)方法里面的代碼內(nèi)容就能知道導(dǎo)入了哪些組件了。

在selectImports這個(gè)方法里面主要有個(gè)configurations,并且這個(gè)configurations最終會被返回。

這個(gè)configurations它是獲取候選的配置。

這個(gè)configurations方法的作用就是利用SpringFactoriesLoader.loadFactoryNames從類路徑下得到一個(gè)資源。

4、那么得到哪些資源呢?

它是掃描javajar包類路徑下的“META-INF/spring.factories”這個(gè)文件。

那么掃描到的這些文件作用:是把這個(gè)文件的urls拿到之后并把這些urls每一個(gè)遍歷,最終把這些文件整成一個(gè)properties對象。

然后它從properties對象里邊獲取一些值,把這些獲取到的值來加載我們最終要返回的這個(gè)結(jié)果,這個(gè)結(jié)果就是我們要交給Spring容器中的所有組件,這相當(dāng)于這factoryClassName就是我們傳過來的Class的這個(gè)類名。

而傳過來的Class是調(diào)用這個(gè)getSpringFactoriesLoaderFactoryClass()這個(gè)方法得到從properties中獲取到EnableAutoConfiguration.class類名對應(yīng)的值。

然后把它們添加在容器中。

5、按照它的這個(gè)意思,來到第二個(gè)Springjar包的META-INF下的spring.factories這個(gè)文件找到配置所有EnableAutoConfiguration的值加入到Spring容器中

所以說我們?nèi)萜髦凶罱K會添加很多的類

比如:

每一個(gè)xxxAutoConfiguration類都是容器中的一個(gè)組件,并都加入到容器中。

加入到容器中之后的作用就是用它們來做自動配置

這就是Springboot自動配置之源,也就是自動配置的開始

只有這些自動配置類進(jìn)入到容器中以后,接下來這個(gè)自動配置類才開始進(jìn)行啟動

6、每一個(gè)自動配置類進(jìn)行自動配置功能

以一個(gè)自動配置類HttpEncodingAutoConfiguration(HTTP的編碼自動配置)為例子來解釋SpringBoot的自動配置之原理:

? 1). 這個(gè)HttpEncodingAutoConfiguration類上面標(biāo)注了一大堆的注解:

點(diǎn)進(jìn)去HttpEncodingProperties這個(gè)類,發(fā)現(xiàn)這個(gè)HttpEncodingProperties類上面標(biāo)注了@ConfigurationProperties注解。

所以說配置文件中該配置什么,我們就按照它的這個(gè)旨意,它要配spring.http.encoding這個(gè)屬性,這個(gè)屬性里邊能配置什么值,就對應(yīng)HttpEncodingProperties這個(gè)類來配置,所有的配置文件中能配置的屬性都是在xxx.Properties類中封裝著。

所以說配置文件能配置什么就可以參照某一個(gè)功能對應(yīng)的這個(gè)屬性類

7、這個(gè)HttpEncodingProperties類就是根據(jù)當(dāng)前不同的條件判斷,決定這個(gè)配置類是否生效。

如果一旦生效了,所有的配置類都成功了,就給容器中添加各種組件,這些組件的屬性是從對應(yīng)的properties類中獲取的,而這properties類里邊的每一個(gè)屬性又是和配置文件綁定的。

我們可以再深入的看一下properties。

我們看到properties是HttpEncodingProperties,也就是說HttpEncodingProperties這個(gè)對象的值它是獲取配置文件的值的,所以我們在配置這個(gè)filter到底要用什么編碼的時(shí)候是從properties獲取的。

而且值得注意的是:

這個(gè)HttpEncodingAutoConfiguration只有一個(gè)有參構(gòu)造器,在只有一個(gè)有參構(gòu)造器的情況下,參數(shù)的值就會從容器中拿

8、而容器中它怎么去拿到呢?

相當(dāng)于是前面的這個(gè)@EnableConfigurationProperties(HttpEncodingProperties.class) 注解,這個(gè)@EnableConfigurationProperties注解的作用就是把HttpEncodingProperties.class和配置文件進(jìn)行綁定起來并把HttpEncodingProperties加入到容器中。

接下來這個(gè)自動配置類,通過一個(gè)有參構(gòu)造器把這個(gè)屬性拿到,而這個(gè)屬性已經(jīng)和SpringBoot映射了,接下來要用什么編碼,就是拿到HttpEncodingProperties這個(gè)類里邊的屬性。

所以SpringBoot能配置什么,它要設(shè)置編碼,它是獲取properties里邊getCharset里邊的name值。

所以就以此類推,配置一個(gè)Spring配置,就可以照著HttpEncodingProperties這里邊的來配置。

比如在application.properties配置文件下配置一個(gè)http.encoding.enabled屬性:

還能配置其他的一些屬性。

比如:

所以我們能夠配置哪些屬性,都是來源于這個(gè)功能的properties類。

有了這個(gè)自動配置類,自動配置類就給容器中添加這個(gè)filter,然后這個(gè)filter就會起作用了。

用好SpringBoot只要把握這幾點(diǎn):

? 1).SpringBoot啟動會加載大量的自動配置類。

? 2).所要做的就是我們需要的功能SpringBoot有沒有幫我們寫好的自動配置類。

? 3).如果有就再來看這個(gè)自動配置類中到底配置了哪些組件,Springboot自動配置類里邊只要我們要用的組件有,我們就不需要再來配置了,但是如果說沒有我們所需要的組件,那么我們就需要自己來寫一個(gè)配置類來把我們相應(yīng)的組件配置起來。

? 4).給容器中自動配置類添加組件的時(shí)候,會從properties類中獲取某些屬性,而這些屬性我們就可以在配置文件指定這些屬性的值。

以上內(nèi)容就是SpringBoot自動配置原理的整個(gè)精髓,只要掌握了SpringBoot的原理,我們才能隨心所欲的運(yùn)用。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容