![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5iNxMmZ5EWOxMGO4YDO5IWOkRTM0EWO2AzN0EjYxATO28CX5d2bs92Yl1iclB3bsVmdlR2LcNWaw9CXt92Yu4GZjlGbh5yYjV3Lc9CX6MHc0RHaiojIsJye.png)
在之前的文章:Spring Boot讀取配置的幾種方式,我介紹到 Spring Boot 中基于 Java Bean 的參數綁定,在一個 Java Bean 類上用 @ConfigurationProperties 注解辨別(更多 Spring Boot 的教程請關注公衆号 "Java技術棧" 在背景回複:boot)。
前幾天,Spring Boot 2.2.0 正式釋出了:Spring Boot 2.2.0 正式釋出,支援 JDK 13!,文中有提到基于構造器的參數綁定,那麼今天棧長就帶大家來實踐一下,到底怎麼用,有什麼用。
廢話不說,先上示例代碼:
import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.boot.context.proper
配置檔案内容:
tom: name: Tom sex: man age: 18 entry-time: 2012-12-12 12:00:00
參數結果輸出:
TomProperties{name='Tom', sex='man', age=18, country='China', entryTime=Wed Dec 12 12:00:00 CST 2012}
通過構造器的參數綁定,其實就是在 @ConfigurationProperties 注解的基礎上再添加一個 '@ConstructorBinding' 注解。
@ConstructorBinding幾點總結:
1、用了 @ConstructorBinding 這個注解,就辨別這個類的參數優先通過帶參數的構造器注入,如果沒有帶參數的構造器則再通過 setters 注入;
怎麼判斷是通過 setters 注入還是構造器注入,請看這個類的源碼:
org.springframework.boot.context.properties.ConfigurationPropertiesBean.BindMethod
2、當 @ConstructorBinding 用在類上時,該類隻能有一個帶參數的構造器;如果有多個構造器時,可以把 @ConstructorBinding 直接綁定到具體的構造方法上;
3、成員變量可以是 final 不可變;
4、支援該類的内部類構造器注入的形式;
5、支援預設值 @DefaultValue、@DateTimeFormat 時間格式等注解配合使用;
6、需要配合 @ConfigurationProperties、@EnableConfigurationProperties 注解使用;
7、不支援像 @Component、@Bean、@Import 等方式建立 bean 的構造器參數綁定;
來看下它的源碼:
@Target({ElementType.TYPE, ElementType.CONSTRUCTOR})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface Const
什麼參數都沒有,可以說明,它就是起到一個構造器參數綁定的辨別作用。