@ConfigurationProperties加载外部配置方式

 更新时间:2023年03月13日 09:48:16   作者:oneslide  
这篇文章主要介绍了@ConfigurationProperties加载外部配置方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

@ConfigurationProperties加载外部配置

@ConfigurationProperties可以将外部配置文件(比如applicaition.properties)加载进来,填充对象的对应字段的数据,然后供其他Bean使用。

整个项目结构是这样的:

在这里插入图片描述

这里我写了一个外部配置文件(application.yml):

environment:
  production:
    url: http://production.example.com
    name: production mode
  dev:
    url: http://dev.example.com
    name: developer mode

可以看见配置文件的数据有结构化特点,即可以生成一个相应的对象。

应该是这个样子:

class Environment{
     Production production;
     Dev dev;
     class Production{
           String url;
           String name;
     }
     class Dev{
           String url;
           String name;
     }
}

真实的代码是这个样子:

在这里插入图片描述

@Configuration   //配置类注解,被自动扫描发现
@PropertySource("classpath:application.yml") //指明配置源文件位置
@ConfigurationProperties("environment") //指明前缀
public class EnvConfig {
    private final Dev dev=new Dev();
    private final Production production=new Production();


    public Dev getDev() {
        return dev;
    }
   //getXXX必须中xxx和字段名production严格一致,否则出异常,即使松弛绑定,也要这样
    public Production getProduction() {
        return production;
    }

    public static class Dev{
        private String url;
        private String name;

        public String getUrl() {
            return url;
        }

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

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
        //toString
    }
    public static class Production{
        private String url;
        private String name;
        //setter and getter省略
       //toString
    }
   //toString()
}

下面测试一下:

@Controller
public class TestStaticController {
    Logger log= LoggerFactory.getLogger(TestStaticController.class);
    @Autowired
    public EnvConfig env;

    @GetMapping("/envtest")
    public String getEnv(){
        log.info(this.env.toString());
        return "test";
    }
}

通过发送HTTP请求,将会在日志中看到:

可以看见,外部配置文件填充了对象EnvConfig,并可以被容器自动注入到其他对象中。

另外,外部配置文件映射成对象还有其他技术如:映射成数组,Map…

@ConfigurationProperties与@EnableConfigurationProperties

@EnableConfigurationProperties注解的作用是:使用 @ConfigurationProperties 注解的类生效。

如果一个配置类只配置@ConfigurationProperties注解,而没有使用@Component,那么在IOC容器中是获取不到properties 配置文件转化的bean。说白了 @EnableConfigurationProperties 相当于把使用 @ConfigurationProperties 的类进行了一次注入

@EnableConfigurationProperties 文档中解释:

当@EnableConfigurationProperties注解应用到你的@Configuration时, 任何被@ConfigurationProperties注解的beans将自动被Environment属性配置。 这种风格的配置特别适合与SpringApplication的外部YAML配置进行配合使用。

@ConfigurationProperties(prefix = "service.properties")
public class HelloServiceProperties {
    private static final String SERVICE_NAME = "test-service";

    private String msg = SERVICE_NAME;
       set/get
}


@Configuration
@EnableConfigurationProperties(HelloServiceProperties.class)
@ConditionalOnClass(HelloService.class)
@ConditionalOnProperty(prefix = "hello", value = "enable", matchIfMissing = true)
public class HelloServiceAutoConfiguration {

}

@RestController
public class ConfigurationPropertiesController {

    @Autowired
    private HelloServiceProperties helloServiceProperties;

    @RequestMapping("/getObjectProperties")
    public Object getObjectProperties () {
        System.out.println(helloServiceProperties.getMsg());
        return myConfigTest.getProperties();
    }
}

自动配置设置(只是在配置文件的)

service.properties.name=my-test-name
service.properties.ip=192.168.1.1
service.user=kayle
service.port=8080

一切正常,但是 HelloServiceAutoConfiguration 头部不使用 @EnableConfigurationProperties,测访问报错。

不使用 @EnableConfigurationProperties 进行注册,使用 @Component 注册

@ConfigurationProperties(prefix = "service.properties")
@Component
public class HelloServiceProperties {
    private static final String SERVICE_NAME = "test-service";

    private String msg = SERVICE_NAME;

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

}

Controller 不变,一切正常,如果注释掉 @Component 测启动报错。

由此证明,两种方式都是将被 @ConfigurationProperties 修饰的类,加载到 Spring Env 中

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java实现登录密码强度校验的项目实践

    Java实现登录密码强度校验的项目实践

    本文主要介绍了Java实现登录密码强度校验的项目实践,包括使用正则表达式匹配校验和密码强度校验工具类这两种方法,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • SpringBoot配置lombok与logback过程解析

    SpringBoot配置lombok与logback过程解析

    这篇文章主要介绍了SpringBoot配置lombok与logback过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • Java日常练习题,每天进步一点点(51)

    Java日常练习题,每天进步一点点(51)

    下面小编就为大家带来一篇Java基础的几道练习题(分享)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望可以帮到你
    2021-08-08
  • java环境变量如何配置

    java环境变量如何配置

    这篇文章主要为大家详细介绍了java环境变量配置教程,感兴趣的小伙伴们可以参考一下
    2016-06-06
  • Java日常练习题,每天进步一点点(10)

    Java日常练习题,每天进步一点点(10)

    下面小编就为大家带来一篇Java基础的几道练习题(分享)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望可以帮到你
    2021-07-07
  • java高并发InterruptedException异常引发思考

    java高并发InterruptedException异常引发思考

    这篇文章主要为大家介绍了java高并发InterruptedException异常引发思考,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • SpringBoot中给指定接口加上权限校验的实现

    SpringBoot中给指定接口加上权限校验的实现

    本文介绍了使用SpringSecurity为接口添加权限校验,以防止外部访问并确保安全性,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-12-12
  • Java实现猜数字小游戏(有次数限制)

    Java实现猜数字小游戏(有次数限制)

    这篇文章主要为大家详细介绍了Java实现猜数字小游戏,有次数限制,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-05-05
  • mybatis plus配置自动create_time和update_time方式

    mybatis plus配置自动create_time和update_time方式

    在处理数据时,注意时间类型的转换非常重要,不同编程环境和数据库对时间数据的处理方式各异,因此在数据迁移或日常处理中需谨慎处理时间格式,个人经验表明,了解常用的时间转换函数和方法能有效避免错误,提高工作效率,希望这些经验能为大家带来帮助
    2024-09-09
  • logback关闭某个包的日志操作

    logback关闭某个包的日志操作

    这篇文章主要介绍了logback关闭某个包的日志操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12

最新评论