引入spring.factories給自己埋下的坑

背景

在項目開發中,自定義了多個配置類,希望能夠通過某種方式來控制加載順序,於是使用了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默認的,不要自己進行聲明管理了。。。
這個坑困擾了自己好長一段時間,還是自己的技術不到位導致的,繼續加油吧!!!!!!!!!!!!!

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