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
    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
  1. 爲了使用 @ConfigurationProperties 需要在 spring boot application 上添加 EnableConfigurationProperties 的註解,這裏遇到的第一個坑
  2. @ConfigurationProperties 可以添加前綴,然後其屬性就會按照變量的名稱默認在 application.* 中尋找指定的變量。這裏就是去尋找 oauth.clientId 這樣的配置。** 如果想要從其他配置文件獲取配置內容,可以添加一個額外的註釋 @PropertySource("classpath:xxx.yml")**
  3. 這裏的 @Setter 是來自 lombok 的註解,它可以自動的幫助添加默認的屬性的 setter 方法。注意,這裏的 setter 方法是必須的,如果沒有 setter 方法,是無法成功獲取配置的,這也是我在使用它的時候遇到的又一個坑
  4. @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

相關資料


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章