zoukankan      html  css  js  c++  java
  • springBoot常用注解之@ConfigurationProperties

    一、简单的源码分析

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

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

    二、@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();
        }
    }

    四、拓展

     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 注解获取到更友好的编程方式,同时这样让我们的配置更加模块化。

  • 相关阅读:
    我们是如何实现DevOps的
    cmp命令
    全排列II
    chown命令
    两个数组的交集II
    MVVM模式的理解
    chmod命令
    路径总和
    cat命令
    跳水板
  • 原文地址:https://www.cnblogs.com/damoblog/p/14198066.html
Copyright © 2011-2022 走看看