1. 程式人生 > 程式設計 >SpringBoot2.2版本配置繫結是不是有點坑了?

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 {
    //...
}複製程式碼

我們發現在SpringBoot2.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介面服務架構師