天天看點

Spring Boot 構造器參數綁定,越來越強大了!

Spring Boot 構造器參數綁定,越來越強大了!

在之前的文章: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      

什麼參數都沒有,可以說明,它就是起到一個構造器參數綁定的辨別作用。