@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
public ValueConfiguration(
@Value("${sso.clientId}") String clientId,
@Value("${sso.clientSecret}") String clientSecret) {
this.clientId = clientId;
this.clientSecret = clientSecret;
}
}
可以看到 @Value
是使用非常的簡單,只要將註解添加在參數前即可。
Demo for @ConfigurationProperties
在有大量參數的時候,一個個添加 @Value
就顯得麻煩了一點,Spring 提供了另一種方式。
@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;
}
直接在成員變量上添加註解就可以了,非常的簡單。然後可以去嘗試添加一些非法的配置試試效果。
完整的 demo 項目在這裏。
更多內容請見 aisensiy.github.io
相關資料