在最近开发中, 遇到较多的读取配置文件的场景, 通常都使用@Value注解读取单个属性 在一次查看的资料中得知, Spring开发环境中推荐使用@Value注解, 而在Spring Boot开发环境中, 推荐使用@configurationproperties, 且源码中大量使用该注解.
1 概述
@ConfigurationProperties是spring Boot提供读取配置文件的一个注解.
源码
/**
* Annotation for externalized configuration. Add this to a class definition or a
* {@code @Bean} method in a {@code @Configuration} class if you want to bind and validate
* some external Properties (e.g. from a .properties file).
* <p>
*/
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Indexed
public @interface ConfigurationProperties {
@AliasFor("prefix")
String value() default "";
@AliasFor("value")
String prefix() default "";
boolean ignoreInvalidFields() default false;
boolean ignoreUnknownFields() default true;
}
value和prefix属性,通过指定的前缀,绑定配置文件中的配置,该注解可以放在类上,也可以放在方法上。
ignoreUnknownFields属性,表示 未知的属性, 可以查找出在yml中声明了,但是没有用的注解,默认是true,即有多余配置会忽略不管; 设置为false时, 如存在无用配置,即启动会报错提示.
ignoreInvalidFields属性, 非法的属性 可以找出配置中和该属性的类型转换是否匹配.默认是false, 即校验属性类型转换,如转换失败,则启动报错提示; 设置为true时,则表示忽略类型转换. 如属性值为boolean类型, 配置中使用字符串, 设置为false,则会启动报错.
根据类上注解说明,该注解用于方法时,需要配合使用@Configuration注解.
另外其对应的bean的后置处理器是ConfigurationPropertiesBindingPostProcessor. 该类实现了BeanPostProcessor接口,在bean被实例化后,会调用后置处理,递归的查找属性,通过反射注入值. 且对于属性要求提供setter和getter方法.
2 使用
数据库配置文件:
spring.datasource.druid.url=jdbc:mysql://localhost:3306/test
spring.datasource.druid.username=root
spring.datasource.druid.password=root
spring.datasource.druid.driver-class-name=com.mysql.jdbc.Driver
1 方法上使用
@Configuration
public class DruidDataSourceConfig {
/**
* DataSource 配置
* @return
*/
@ConfigurationProperties(prefix = "spring.datasource.druid")
@Bean(name = "dataSource")
public DataSource getDataSource() {
return new Datasource();
}
}
2 类上使用
@ConfigurationProperties(prefix = "spring.datasource.druid")
@Component
public class Datasource {
private String url;
private String username;
private String password;
// 配置文件中是driver-class-name, 转驼峰命名便可以绑定成
private String driverClassName;
private String type;
// 省略set/get语句
}
如此处不使用@Component , 可通过@EnableConfigurationProperties(Datasource.class)将bean注入容器中.
3 对比
关于@ConfigurationProperties和@Value注解:
- @ConfigurationProperties注解支持属性文件和javabean的映射,而@Value支持spel表达式
- 如果是多个属性映射,推荐使用@ConfigurationProperties; 读取单个属性则推荐使用@Value
- 在复杂的场景中, 二者也可以混用