SpringBoot自動配置原理
知音專欄
SpringBoot自動配置原理
備註:該SpringBoot自動配置原理不適合java剛入門學者以及不熟悉Spring4+Springmvc+maven的同學
1、當SpringBoot應用啟動的時候,就從主方法裡面進行啟動的。
它主要載入了@SpringBootApplication註解主配置類,這個@SpringBootApplication註解主配置類裡邊最主要的功能就是SpringBoot開啟了一個@EnableAutoConfiguration註解的自動配置功能。
2、@EnableAutoConfiguration作用:
它主要利用了一個
EnableAutoConfigurationImportSelector選擇器給Spring容器中來導入一些組件。
3、那麼導入了哪些組件呢?
我們來看
EnableAutoConfigurationImportSelector這個類的父類selectImports
父類裡面規定了一個方法叫selectImports這個方法,查看了selectImports這個方法裡面的代碼內容就能知道導入了哪些組件了。
在selectImports這個方法裡面主要有個configurations,並且這個configurations最終會被返回。
這個configurations它是獲取候選的配置。
這個configurations方法的作用就是利用SpringFactoriesLoader.loadFactoryNames從類路徑下得到一個資源
4、那麼得到哪些資源呢?
它是掃描javajar包類路徑下的「META-INF/spring.factories」這個文件
那麼掃描到的這些文件作用:是把這個文件的urls拿到之後並把這些urls每一個遍歷,最終把這些文件整成一個properties對象
然後它從properties對象裡邊獲取一些值,把這些獲取到的值來載入我們最終要返回的這個結果,這個結果就是我們要交給Spring容器中的所有組件,這相當於這factoryClassName就是我們傳過來的Class的這個類名。
而傳過來的Class是調用這個
getSpringFactoriesLoaderFactoryClass()這個方法得到從properties中獲取到EnableAutoConfiguration.class類名對應的值
然後把它們添加在容器中
5、按照它的這個意思,來到第二個Springjar包的META-INF下的spring.factories這個文件找到配置所有EnableAutoConfiguration的值加入到Spring容器中
所以說我們容器中最終會添加很多的類
比如:
每一個xxxAutoConfiguration類都是容器中的一個組件,並都加入到容器中。
加入到容器中之後的作用就是用它們來做自動配置,這就是Springboot自動配置之源,也就是自動配置的開始,只有這些自動配置類進入到容器中以後,接下來這個自動配置類才開始進行啟動
6、每一個自動配置類進行自動配置功能
以一個自動配置類
HttpEncodingAutoConfiguration(HTTP的編碼自動配置)為例子來解釋SpringBoot的自動配置之原理:
1). 這個HttpEncodingAutoConfiguration類上面標註了一大堆的註解:
點進去HttpEncodingProperties這個類,發現這個HttpEncodingProperties類上面標註了@ConfigurationProperties註解
所以說配置文件能配置什麼就可以參照某一個功能對應的這個屬性類
7、這個HttpEncodingProperties類就是根據當前不同的條件判斷,決定這個配置類是否生效。
如果一旦生效了,所有的配置類都成功了,就給容器中添加各種組件,這些組件的屬性是從對應的properties類中獲取的,而這properties類裡邊的每一個屬性又是和配置文件綁定的
我們可以再深入的看一下properties
我們看到properties是
HttpEncodingProperties,也就是說HttpEncodingProperties這個對象的值它是獲取配置文件的值的,所以我們在配置這個filter到底要用什麼編碼的時候是從properties獲取的。
而且值得注意的是:
這個HttpEncodingAutoConfiguration只有一個有參構造器,在只有一個有參構造器的情況下,參數的值就會從容器中拿
8、而容器中它怎麼去拿到呢?
相當於是前面的這個
@EnableConfigurationProperties(HttpEncodingProperties.class) 註解,這個@EnableConfigurationProperties註解的作用就是把HttpEncodingProperties.class和配置文件進行綁定起來並把HttpEncodingProperties加入到容器中。
接下來這個自動配置類,通過一個有參構造器把這個屬性拿到,而這個屬性已經和SpringBoot映射了,接下來要用什麼編碼,就是拿到HttpEncodingProperties這個類裡邊的屬性。
所以SpringBoot能配置什麼,它要設置編碼,它是獲取properties裡邊getCharset裡邊的name值。
所以就以此類推,配置一個Spring配置,就可以照著HttpEncodingProperties這裡邊的來配置。
比如在application.properties配置文件下配置一個http.encoding.enabled屬性:
還能配置其他的一些屬性。
比如:
所以我們能夠配置哪些屬性,都是來源於這個功能的properties類
有了這個自動配置類,自動配置類就給容器中添加這個filter,然後這個filter就會起作用了。
用好SpringBoot只要把握這幾點:
SpringBoot啟動會載入大量的自動配置類
所要做的就是我們需要的功能SpringBoot有沒有幫我們寫好的自動配置類:
如果有就再來看這個自動配置類中到底配置了哪些組件,Springboot自動配置類裡邊只要我們要用的組件有,我們就不需要再來配置了,但是如果說沒有我們所需要的組件,那麼我們就需要自己來寫一個配置類來把我們相應的組件配置起來。
給容器中自動配置類添加組件的時候,會從properties類中獲取某些屬性,而這些屬性我們就可以在配置文件指定這些屬性的值
以上內容就是SpringBoot自動配置原理的整個精髓,只要掌握了SpringBoot的原理,我們才能隨心所欲的運用。
【推薦演算法類公眾號:演算法文摘】
![](https://pic.pimg.tw/zzuyanan/1488615166-1259157397.png)
![](https://pic.pimg.tw/zzuyanan/1482887990-2595557020.jpg)
TAG:Java知音 |