從零開始的Spring Boot學習【四】【自動裝配(三)】

public static final String FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories";

我們得知了Spring配置的第三方jar包都在如上的這個路徑被引用,那麼我們就去找到這個文件,看看它裏面到底寫了什麼東西。

 

我們之前已經打開過了Maven Dependencies,在裏面找到了有關Spring Boot的管理配置的jar包,在這個jar包中存放了很多package和很多class文件,我們移動到最下方,我們會找到了META-INF

在META-INF文件夾中,果然有一個spring.factories,我們打開這個文件。

會發現這是一個存放了第三方各種依賴的工廠,裏面包含了各種jar的名字,引用這個文件就可以獲取第三方jar的相關信息。Spring Boot在啓動時,會根據META-INF/spring.factories找到相應的三方依賴,並將這些依賴引入本項目,在上方的package中,都能找到與之對應的名字,也就是說jar包提供了具體的類,也提供了相應的配置文件

那麼多的jar包,難道我們全部都引用到了項目中嗎?像我這個只是一個最基本的Spring Boot的demo,輸出一句簡單的hello world,根本不需要那麼多的jar包,一次性引用那麼多沒有用到的依賴,使得項目體積變大,造成了不必要的浪費,所以Spring Boot並不會一次性讓所有的依賴注入到項目中,而是在你有需求的時候,纔會把開啓自動裝配。如何實現的呢?

首先我們先回到之前配置了編碼格式的jar包中去,在Maven Dependencies的上述位置,我們點擊進去看看源碼。

@Configuration和@EnableConfigurationProperties我們之前已經講過哩,忘記了的童鞋或者沒有看的同學請看我之前所寫的文章,下方有鏈接哦。我們來說下它是如何實現當需要時纔去注入到項目中。我用紅色筆框起來的三個部分就是關鍵因素,Conditional是條件的意思,on:當什麼的時候,也就是說當滿足on後面的條件的時候,我們就會注入相關的依賴(開啓自動裝配)。上述的意思可查:

也就是說只有三個條件都滿足了,Spring Boot纔會自動去執行下面的這個代碼(注入依賴)。

那麼我們難道要每一個類都要這樣去找,判斷它是不是條件滿足嗎?當然不用,Spring Boot提供了一個方法可以快速知曉到底注入了哪些依賴。

我們在配置文件中輸入這麼一句話debug=true。然後我們運行一次程序看看。

上述Positive matches是匹配到的jar包,即已經注入依賴的。

Negative matches是沒有匹配到的jar包,即沒有注入的依賴。

即debug是生成了一個報告,告訴我們哪些開啓了,哪些沒有開啓。

我們來總結一下:

編寫項目時,一般會對自己寫的代碼以及 三方依賴 進行配置。但是Spring Boot可以自動進行配置:
 

a:自己寫的代碼,Spring Boot通過@SpringBootConfiguration自動幫我們配置。
b. 三方依賴通過spring-boot-autoconfigure-X.X.X.RELEASE.jar中的META-INF/spring.factories進行聲明。
然後通過@EnableAutoConfiguration開啓使用即可。
(spring-boot-autoconfigure-X.X.X.RELEASE.jar包中包含了J2EE整合體系中 需要的依賴)。
c.如何自動裝配:研究org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration,\。
通過觀察該源碼 發現:@Configuration:標識此類是一個配置類 ,將此類納入springioc容器。


@ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled", matchIfMissing = true),當屬性滿足要求時,此條件成立  :要求 如果沒有配置spring.http.encoding.enabled=xxx, 則成立。

1.每一個XxAutoConfiguration 都有很多條件@ConditionalOnXxx。
當這些條件都滿足時,則此配置自動裝配生效(utf-8)。
但是我們可以手工修改改 自動裝配: XxxProperties文件中的prefix.屬性名=value。

2.如何知道Spring Boot開啓了哪些自動裝配、禁止了哪些自動裝配: application.properties中輸入debug=true。
Positive matches列表表示Spring Boot自動開啓的裝配。
Negative matches列表表示Spring Boot在此時並沒有啓用的自動裝配。

上一章:從零開始的Spring Boot學習【三】【自動裝配(二)】

下一章:從零開始的Spring Boot學習【五】【配置文件及yml使用】

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章