一、简单的源码分析

Spring源码中大量使用了ConfigurationProperties注解,比如server.port就是由该注解获取到的,通过与其他注解配合使用,能够实现Bean的按需配置。

该注解有一个prefix属性,通过指定的前缀,绑定配置文件中的配置,通过如下源码可以看出,该注解可以放在类上,也可以放在方法上。

springBoot常用注解之@ConfigurationProperties-编程知识网

二、@ConfigurationProperties时使用的注意事项

1.  前缀定义了哪些外部属性将绑定到类的字段上;

2. 根据 Spring Boot 宽松的绑定规则,类的属性名称必须与外部属性的名称匹配;

    Spring 宽松绑定规则 (relaxed binding,Spring使用一些宽松的绑定属性规则。因此,以下变体都将绑定到 hostName 属性上:
    hostName、hostname、host-name、host_name、HOST_NAME等。

3. 我们可以简单地用一个值初始化一个字段来定义一个默认值;

4. 类本身可以是包私有的;

5. 类的字段必须有公共 setter 方法;

三、实例应用

@ConfigurationProperties的使用有两种方式。

配置文件内容,这里用的是*.poperties做的案例,实际使用中组好使用*.yml文件。

spring.datasource.url=jdbc:mysql://127.0.0.1:8888/test?useUnicode=false&autoReconnect=true&characterEncoding=utf-8
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource

第一种是作用类上:如下

java代码:

@ConfigurationProperties(prefix = "spring.datasource")
@Component
public class DatasourcePro {

    private String url;

    private String username;

    private String password;

    // 配置文件中是driver-class-name, 转驼峰命名便可以绑定成
    private String driverClassName;

    private String type;

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getDriverClassName() {
        return driverClassName;
    }

    public void setDriverClassName(String driverClassName) {
        this.driverClassName = driverClassName;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }
}

controller中的使用:

@Controller
@RequestMapping(value = "/config")
public class ConfigurationPropertiesController {

    @Autowired
    private DatasourcePro datasourcePro;

    @RequestMapping("/test")
    @ResponseBody
    public Map<String, Object> test(){

        Map<String, Object> map = new HashMap<>();
        map.put("url", datasourcePro.getUrl());
        map.put("userName", datasourcePro.getUsername());
        map.put("password", datasourcePro.getPassword());
        map.put("className", datasourcePro.getDriverClassName());
        map.put("type", datasourcePro.getType());

        return map;
    }
}

第二种作用与方法上:

java POJO:

public class Datasource {

    private String url;

    private String username;

    private String password;

    // 配置文件中是driver-class-name, 转驼峰命名便可以绑定成
    private String driverClassName;

    private String type;

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getDriverClassName() {
        return driverClassName;
    }

    public void setDriverClassName(String driverClassName) {
        this.driverClassName = driverClassName;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }
}

配置类上:

@Configuration
public class DruidDataSourceConfig {
    /**
     * DataSource 配置
     * @return
     */
    @ConfigurationProperties(prefix = "spring.datasource.druid.read")
    @Bean(name = "readDruidDataSource")
    public DataSource readDruidDataSource() {
        return new DruidDataSource();
    }
}

四、拓展

springBoot常用注解之@ConfigurationProperties-编程知识网

 1. 通过源码可以看大有 ignoreInvalidFields和ignoreUnknownFields两个属性。其中

    ignoreInvalidFields:表示是文件*.yml提供了DataSource类无法转换的属性,默认情况下,Spring Boot 将会启动失败,并抛出异常:

    ignoreUnknownFields:表示文件*.yml提供了DataSource类无法识别的属性;

2. 启动时校验 @ConfigurationProperties、Duration、DataSize、Deprecated(@DeprecatedConfigurationProperty)。

详情可参考https://blog.csdn.net/yusimiao/article/details/97622666博客

 总结:

1. @ConfigurationProperties 和 @value 有着相同的功能,但是 @ConfigurationProperties的写法更为方便

2. Spring Boot 的 @ConfigurationProperties 注解在绑定类型安全的 Java Bean 时是非常强大的,我们可以配合其注解属性和

 @DeprecatedConfigurationProperty 注解获取到更友好的编程方式,同时这样让我们的配置更加模块化。