1. 程式人生 > >springboot(24)@ConfigurationProperties 與 @Value

springboot(24)@ConfigurationProperties 與 @Value

轉載自簡書本文連結地址: 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

就顯得麻煩了一點,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;
}

直接在成員變數上添加註解就可以了,非常的簡單。然後可以去嘗試新增一些非法的配置試試效果。