SpringBoot之ConfigurationProperties 源碼解讀

前言

ConfigurationPropertiesSpringBoot引入的一個和外部配置文件相關的註解類。它能夠幫助咱們更好的使用外置的配置文件屬性。java

源碼解析

屬性注入到Java類數組

@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ConfigurationProperties {
    @AliasFor("prefix")
    String value() default "";
    @AliasFor("value")
    String prefix() default "";
    boolean ignoreInvalidFields() default false;
    boolean ignoreNestedProperties() default false;
    boolean ignoreUnknownFields() default true;
    @Deprecated
    boolean exceptionIfInvalid() default true;
}
  • prefix & value
    • prefix 屬性能夠指定配置文件中配置項的前綴,如此,相同前綴的配置項就能夠統一解析。
  • ignoreInvalidFields
    • 是否忽略不可用的字段,默認爲false, 當配置項不能被正確轉化爲Java類的字段值時,會拋出異常。
  • ignoreNestedProperties
    • 是否忽略嵌套屬性,默認爲false,
  • ignoreUnknownFields
    • 是否忽略Java類不存在的字段,默認值爲true。
  • exceptionIfInvalid
    • 若是Java類加了註解@Validated,而且校驗失敗了,是否拋出異常。默認true

經過@ConfigurationProperties + @Bean註解在配置類的bean定義方法上app

@Configuration
@ConfigurationProperties
@PropertySource("classpath:configprops.properties")
public class ConfigProperties {
 
    public static class Credentials {
        @Length(max = 4, min = 1)
        private String authMethod;
        private String username;
        private String password;
 
       // standard getters and setters
    }
    @NotBlank
    private String host;
    @Min(1025)
    @Max(65536)
    private int port;
    @Pattern(regexp = "^[a-z0-9._%+-]+@[a-z0-9.-]+\\.[a-z]{2,6}$")
    private String from;
    private Credentials credentials;
    private List<String> defaultRecipients;
    private Map<String, String> additionalHeaders;
  
    // standard getters and setters
}

默認屬性配置從application.properties文件中獲取,也能夠經過@PropertySource指定。 @Configuration註解不可缺乏。 資源文件內容以下:spa

#Simple properties
mail.host=mailer@mail.com
mail.port=9000
mail.from=mailer@mail.com
 
#List properties
mail.defaultRecipients[0]=admin@mail.com
mail.defaultRecipients[1]=owner@mail.com
 
#Map Properties
mail.additionalHeaders.redelivery=true
mail.additionalHeaders.secure=true
 
#Object properties
mail.credentials.username=john
mail.credentials.password=password
mail.credentials.authMethod=SHA1

內嵌類屬性code

  • mail.credentials.username能夠注入到內嵌屬性credentials中 列表字段
  • mail.defaultRecipients[0] 能夠注入到類的列表(數組頁能夠)屬性中。 map字段
  • mail.additionalHeaders.redelivery 格式的配置項也能夠注入到Map類型的屬性中。

@ConfigurationProperties + @EnableConfigurationPropertiesregexp

@Bean
@ConfigurationProperties(prefix = "mail")
public ConfigProperties mailConfig() {
    return new ConfigProperties();
}
@SpringBootApplication
@EnableConfigurationProperties({ConfigProperties.class})
public class Application {
    public static void main(String[] args) throws Exception {
        SpringApplication.run(Application.class, args);
    }
}

屬性校驗

能夠給屬性類上加入javax.validation.constraints.*中的註解,來對配置項進行校驗。配合exceptionIfInvalid能夠更早的發現問題。ip

相關文章
相關標籤/搜索