1、當(dāng)SpringBoot應(yīng)用啟動(dòng)的時(shí)候钻注,就從主方法里面進(jìn)行啟動(dòng)的。
它主要加載了@SpringBootApplication注解主配置類,這個(gè)@SpringBootApplication注解主配置類里邊最主要的功能就是SpringBoot開啟了一個(gè)@EnableAutoConfiguration注解的自動(dòng)配置功能猎莲。
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最終會(huì)被返回展鸡。
這個(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會(huì)添加很多的類
比如:
每一個(gè)xxxAutoConfiguration類都是容器中的一個(gè)組件,并都加入到容器中丢早。
加入到容器中之后的作用就是用它們來做自動(dòng)配置
這就是Springboot自動(dòng)配置之源姨裸,也就是自動(dòng)配置的開始
只有這些自動(dòng)配置類進(jìn)入到容器中以后,接下來這個(gè)自動(dòng)配置類才開始進(jìn)行啟動(dòng)
6怨酝、每一個(gè)自動(dòng)配置類進(jìn)行自動(dòng)配置功能
以一個(gè)自動(dòng)配置類HttpEncodingAutoConfiguration(HTTP的編碼自動(dòng)配置)為例子來解釋SpringBoot的自動(dòng)配置之原理:
? 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ù)的值就會(huì)從容器中拿
8言询、而容器中它怎么去拿到呢?
相當(dāng)于是前面的這個(gè)@EnableConfigurationProperties(HttpEncodingProperties.class) 注解傲宜,這個(gè)@EnableConfigurationProperties注解的作用就是把HttpEncodingProperties.class和配置文件進(jìn)行綁定起來并把HttpEncodingProperties加入到容器中运杭。
接下來這個(gè)自動(dòng)配置類,通過一個(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è)自動(dòng)配置類,自動(dòng)配置類就給容器中添加這個(gè)filter转质,然后這個(gè)filter就會(huì)起作用了园欣。
用好SpringBoot只要把握這幾點(diǎn):
? 1).SpringBoot啟動(dòng)會(huì)加載大量的自動(dòng)配置類。
? 2).所要做的就是我們需要的功能SpringBoot有沒有幫我們寫好的自動(dòng)配置類休蟹。
? 3).如果有就再來看這個(gè)自動(dòng)配置類中到底配置了哪些組件沸枯,Springboot自動(dòng)配置類里邊只要我們要用的組件有日矫,我們就不需要再來配置了,但是如果說沒有我們所需要的組件绑榴,那么我們就需要自己來寫一個(gè)配置類來把我們相應(yīng)的組件配置起來哪轿。
? 4).給容器中自動(dòng)配置類添加組件的時(shí)候,會(huì)從properties類中獲取某些屬性翔怎,而這些屬性我們就可以在配置文件指定這些屬性的值窃诉。
以上內(nèi)容就是SpringBoot自動(dòng)配置原理的整個(gè)精髓,只要掌握了SpringBoot的原理赤套,我們才能隨心所欲的運(yùn)用飘痛。