关于@configurationproperties注解的使用

  • 1 概述
  • 2 使用
  • 1 方法上使用
  • 2 类上使用
  • 3 对比

在最近开发中, 遇到较多的读取配置文件的场景, 通常都使用@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
  • 在复杂的场景中, 二者也可以混用