我們以httpencodingautoconfiguration(http編碼自動配置)為例解釋自動配置原理;
//表示這是乙個配置類,和以前編寫的配置檔案一樣,也可以給容器中新增元件;
@configuration
//啟動指定類的configurationproperties功能;
//進入這個httpproperties檢視,將配置檔案中對應的值和httpproperties繫結起來;
//並把httpproperties加入到ioc容器中
@enableconfigurationproperties()
//spring底層@conditional註解
//根據不同的條件判斷,如果滿足指定的條件,整個配置類裡面的配置就會生效;
//這裡的意思就是判斷當前應用是否是web應用,如果是,當前配置類生效
( type = type.servlet
)//判斷當前專案有沒有這個類characterencodingfilter;springmvc中進行亂碼解決的過濾器;
@conditionalonclass()
//判斷配置檔案中是否存在某個配置:spring.http.encoding.enabled;
//如果不存在,判斷也是成立的
//即使我們配置檔案中不配置pring.http.encoding.enabled=true,也是預設生效的;
//給容器中新增乙個元件,這個元件的某些值需要從properties中獲取
@bean
@conditionalo****singbean
//判斷容器沒有這個元件?
public characterencodingfilter characterencodingfilter()
//。。。。。。。
}
一句話總結 :根據當前不同的條件判斷,決定這個配置類是否生效!
1.一但這個配置類生效;這個配置類就會給容器中新增各種元件;
2.這些元件的屬性是從對應的properties類中獲取的,這些類裡面的每乙個屬性又是和配置檔案繫結的;
3.所有在配置檔案中能配置的屬性都是在***xproperties類中封裝著;
4.配置檔案能配置什麼就可以參照某個功能對應的這個屬性類
//從配置檔案中獲取指定的值和bean的屬性進行繫結
1、springboot啟動會載入大量的自動配置類
2、我們看我們需要的功能有沒有在springboot預設寫好的自動配置類當中;
3、我們再來看這個自動配置類中到底配置了哪些元件;(只要我們要用的元件存在在其中,我們就不需要再手動配置了)
4、給容器中自動配置類新增元件的時候,會從properties類中獲取某些屬性。我們只需要在配置檔案中指定這些屬性的值即可;
***xautoconfigurartion:自動配置類;給容器中新增元件
***xproperties:封裝配置檔案中相關屬性;
了解完自動裝配的原理後,我們來關注乙個細節問題,自動配置類必須在一定的條件下才能生效;
@conditional派生註解(spring註解版原生的@conditional作用)
作用:必須是@conditional指定的條件成立,才給容器中新增元件,配置配裡面的所有內容才生效;
那麼多的自動配置類,必須在一定的條件下才能生效;也就是說,我們載入了這麼多的配置類,但不是所有的都生效了。
我們怎麼知道哪些自動配置類生效?
我們可以通過啟用 debug=true屬性;來讓控制台列印自動配置報告,這樣我們就可以很方便的知道哪些自動配置類生效;
#開啟springboot的除錯類
debug=
true
positive matches:(自動配置類啟用的:正匹配)
negative matches:(沒有啟動,沒有匹配成功的自動配置類:負匹配)
unconditional classes: (沒有條件的類)
掌握吸收理解原理,即可以不變應萬變!
alt+f7 可以檢視被呼叫關係 方便解析原始碼
《springboot原始碼系列》 自動裝配原理
輔助判斷 初始化第三方jar擴充套件點 這個方法點進去,最終是執行了 springfactoriesloader.loadfactorynames type,classloader 可以看到這裡印證了我們上面說的掃瞄所有依賴jar 的 meta inf spring.factories 所有的配置類...
Springboot自動裝配
而下面那個 import 這個類點進去主要就是為了載入springboot的各種配置檔案。在這個類中你可以找到如下這個方法,去載入配置路徑為meta inf spring autoconfigure metadata.properties檔案。還有乙個方法則會去載入目錄下meta inf sprin...
spring boot 之自動裝配
在之前用spring框架進行開發的時候,我們要寫巨多的配置檔案,並且隨著功能的完善,還需要不停的修改這些檔案,非常痛苦,但是在使用spring boot 之後就沒有這些煩惱啦 雖然還是要寫一點點,但是對比以前,忽略不計 是真的不需要寫這些檔案了嗎?其實這些檔案時spring boot 在啟動時幫我們...