SpringBoot2.2版本配置繫結是不是有點坑了?
SpringBoot
版本升級相容性一直做的不是多麼的美麗,各個大分支之間由於底層使用的Srping
版本不同,才導致的這種問題出現,而升級到2.2.1.RELEASE
版本之後又遇到一個配置繫結
的坑。
問題描述
SpringBoot
在升級到2.2.1.RELEASE
版本後遇到了屬性配置
繫結的問題,我去找到SpringBoot
版本釋出的頁面(Spring-Boot-2.2-Release-Notes)才瞭解到從2.2.1.RELEASE
版本開始@SpringBootApplication
註解已經不再新增@ConfigurationPropertiesScan
支援,需要手動進行配置,這一點我們從原始碼上可以更清楚的看到。
2.2.0.RELEASE
SpringBoot
2.2.0.RELEASE版本中@SpringBootApplication
註解部分原始碼如下所示:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM,classes = TypeExcludeFilter.class),@Filter(type = FilterType.CUSTOM,classes = AutoConfigurationExcludeFilter.class) })
@ConfigurationPropertiesScan
public @interface SpringBootApplication {
//...
}複製程式碼
通過原始碼我們可以看到2.2.0.RELEASE版本的@SpringBootApplication
註解預設添加了ConfigurationPropertiesScan
註解,也就是預設開啟了掃描@ConfigurationProperties
註解的配置類,然後根據prefix
進行屬性繫結。
2.2.1.RELEASE
SpringBoot
2.2.1.RELEASE版本中@SpringBootApplication
註解部分原始碼如下所示:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM,classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
//...
}複製程式碼
我們發現在SpringBoot
2.2.1.RELEASE版本的@SpringBootApplication
註解中已經不再預設新增@ConfigurationPropertiesScan
註解的支援了,也就是我們無法通過預設的配置實現掃描@ConfigurationProperties
註解的類,也無法將application.yml/application.properties
檔案的配置內容與實體類內的屬性進行繫結。
解決問題
SpringBoot
官方給出的解決方法是手動在@SpringBootApplication
註解的類上手動新增@ConfigurationPropertiesScan
即可,如下所示:
/**
* 2.2.1.RELEASE版本屬性繫結問題解決
*
* @author 恆宇少年
*/
@SpringBootApplication
@ConfigurationPropertiesScan
public class SpringbootConfigurationBindingBitPittedApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootConfigurationBindingBitPittedApplication.class,args);
}
}複製程式碼
敲黑板,劃重點
SpringBoot
的每次中大版本升級往往會刪除或者新增一些功能,建議大家關注SpringBoot
的動態,以免出現類似今天這篇文章的問題,根據官方的檔案及時做出調整。
程式碼示例
微信掃碼下圖二維碼關注“程式設計師恆宇少年”後,回覆“原始碼”即可獲取原始碼倉庫地址。
本章節原始碼在spring-boot-chapter
倉庫內目錄為springboot2-2-configuration-binding-bit-pitted
作者個人 部落格
使用開源框架 ApiBoot 助你成為Api介面服務架構師