springboot(24)@ConfigurationProperties 與 @Value
阿新 • • 發佈:2018-11-16
轉載自簡書本文連結地址: Spring Boot @ConfigurationProperties 與 @Value
@ConfigurationProperties
和@Value
都是 Spring 提供的用於從配置檔案注入配置資訊的方式。很顯然,@Value
比較適用於配置比較少的場景,而@ConfigurationProperties
則更適用於有很多配置的情況。之前寫專案的時候從來都沒有使用過@ConfigurationProperties
幾乎每次都是使用@Value
。這次遇到了一個比較適合它的場景,在使用的時候還真遇到了一些令人討厭的小問題,導致開發速度受到了一定的影響。這裡記錄下來他們之間的使用方式和可能出現的坑,加深一下印象。
注意,我們這裡使用application.yml
而不是application.properties
不過他們基本是可以相互替代的。
Demo for @Value
sso:
clientId: clientId
clientSecret: clientSecret
@Component
@Data
public class ValueConfiguration {
private String clientId;
private String clientSecret;
@Autowired //此處必須加Autowired註解
public ValueConfiguration(
@Value("${sso.clientId}") String clientId,
@Value("${sso.clientSecret}") String clientSecret) {
this.clientId = clientId;
this.clientSecret = clientSecret;
}
}
可以看到@Value
是使用非常的簡單,只要將註解新增在引數前即可。
Demo for @ConfigurationProperties
在有大量引數的時候,一個個新增@Value
@SpringBootApplication
@EnableConfigurationProperties // 1
public class DemoForSpringBootConfigurationApplication {
public static void main(String[] args) {
SpringApplication.run(DemoForSpringBootConfigurationApplication.class, args);
}
@Bean
CommandLineRunner run(ValueConfiguration valueConfiguration) {
return args -> {
System.out.println(valueConfiguration.toString());
};
}
@Bean
CommandLineRunner config(PropertiesConfiguration configuration) {
return args -> {
System.out.println(configuration);
};
}
}
@Component
@ConfigurationProperties(prefix = "oauth") // 2
@Getter
@Setter // 3
@ToString
public class PropertiesConfiguration {
private String clientId;
private String clientSecret;
private String redirectUri;
private String grantType;
}
sso:
clientId: clientId
clientSecret: clientSecret
oauth:
client_id: id // 4
client-secret: secret
redirect_uri: http://aisensiy.github.io
grantType: code
- 為了使用
@ConfigurationProperties
需要在spring boot application上新增EnableConfigurationProperties
的註解,這裡遇到的第一個坑 @ConfigurationProperties
可以新增字首,然後其屬性就會按照變數的名稱預設在application.*
中尋找指定的變數。這裡就是去尋找oauth.clientId
這樣的配置。如果想要從其他配置檔案獲取配置內容,可以新增一個額外的註釋@PropertySource("classpath:xxx.yml")
- 這裡的
@Setter
是來自lombok的註解,它可以自動的幫助新增預設的屬性的setter方法。注意,這裡的setter方法是必須的,如果沒有setter方法,是無法成功獲取配置的,這也是我在使用它的時候遇到的又一個坑 @ConfigurationProperties
與@Value
的一個重大區別在於它採用比較靈活的方式尋找配置。可以看到這裡的配置可以是駝峰形式,也可以是下劃線分割的,還可以是中橫線分割的
新增引數驗證
@ConfigurationProperties
是可以和validation註解一起使用的,這樣的好處顯而易見:對於一些配置是必須的或者是對格式有要求的,在執行開始的時候就能檢測到這些問題可以避免上線之後因為配置不符合有找不到頭緒而導致的debug的痛苦過程。
@Component
@Getter
@Setter
@ToString
@ConfigurationProperties(prefix = "oauth")
public class PropertiesConfiguration {
@NotBlank
private String clientId;
@NotBlank
private String clientSecret;
@URL
private String redirectUri;
@NotBlank
private String grantType;
}
直接在成員變數上添加註解就可以了,非常的簡單。然後可以去嘗試新增一些非法的配置試試效果。