前言
ConfigurationProperties 是SpringBoot引入的一個和外部配置文件相關的注解類。它可以幫助我們更好的使用外置的配置文件屬性。
源碼解析
屬性注入到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定義方法上
@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注解不可缺少。
資源文件內容如下:
#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
內嵌類屬性
mail.credentials.username可以注入到內嵌屬性credentials中
列表字段mail.defaultRecipients[0]可以注入到類的列表(數組頁可以)屬性中。
map字段mail.additionalHeaders.redelivery格式的配置項也可以注入到Map類型的屬性中。
@ConfigurationProperties + @EnableConfigurationProperties
@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可以更早的發現問題。
