背景
在項目開發中,自定義了多個配置類,希望能夠通過某種方式來控制加載順序,於是使用了spring.factories文件。
現象
引入spring.factories文件後,導致原本寫在application.yml文件中的server.port不生效了。
分析
首先,看一下@Configuration註解的類
@Configuration
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE)
@EnableConfigurationProperties({ ServerProperties.class, SfProperties.class })
public class SfHttpClientAutoConfiguration {
// 此處省略部分代碼
}
其中,ServerProperties.class是springboot裏面的一個自動配置的類,請記住這個類。
SfProperties.class是自定義的類,代碼如下:
@ConfigurationProperties(prefix = "server.sf", ignoreUnknownFields = true)
@Data
public class SfClientProperties {
/**
* @fieldName: enabled
* @fieldType: boolean
* @Description: 開關標識,默認false
*/
private boolean enabled = false;
}
這個類有@ConfigurationProperties註解,想將配置文件中以"server.sf"開頭的屬性配置映射到這個類中,作爲一個Bean交給Spring容器管理。但是僅僅有@ConfigurationProperties註解是不夠的,需要@EnableConfigurationProperties註解。
EnableConfigurationProperties,在SpringBoot的註釋中是這樣說明的:爲帶有@ConfigurationProperties註解的Bean提供有效的支持。這個註解可以提供一種方便的方式來將帶有@ConfigurationProperties註解的類注入爲Spring容器的Bean。
所以,上述中會將ServerProperties和SfProperties兩個類作爲Bean交給Spring容器管理,並且裏面屬性的值會根據配置文件去映射。
接下來看一下spring.factories文件中的內容:
org.springframework.cloud.bootstrap.BootstrapConfiguration=\
com.sf.steven.http.spring.boot.autoconfiguration.SfHttpClientAutoConfiguration
這裏指定的自動配置類就是自定義的配置類,它會去讀取bootstrap裏配置項。
結束語
綜合上述內容,最終會產生兩個自定義的Bean:ServerProperties和SfProperties,SfProperties還好說,本身它裏面的屬性就是要放到bootstrap配置文件中去的,所以產生的Bean中屬性都有值且正常的。
但是,ServerProperties原本是springboot自帶的一個類,這裏由於@EnableConfigurationProperties註解裏value值的使用不當,導致ServerPropertiesBean裏面的屬性也只會與bootstrap裏面的配置項進行映射,所以就出現了在application配置文件中配置了不起作用,但是在bootstrap配置文件中就可以讀取到值現象。
最後,只需要將ServerProperties.class刪除掉就可以了,讓它成爲springboot默認的,不要自己進行聲明管理了。。。
這個坑困擾了自己好長一段時間,還是自己的技術不到位導致的,繼續加油吧!!!!!!!!!!!!!