• @EnableConfigurationProperties和@ConfigurationProperties用法及注意事项


    在开发过程中,我们经常看到以下2个注解:
    @ConfigurationProperties
    @EnableConfigurationProperties

    一、先分别介绍一下这两个注解的用法:

    1、@ConfigurationProperties

    是springboot提供读取配置文件的一个注解,将我们项目中的yaml文件或者properties文件加载到bean对象进行使用。例如:当我们application.properties里面有如下 2个配置

    aws.ltbus.username=1
    aws.ltbus.password=2
    
    • 1
    • 2

    我们可以通过类使用注解@ConfigurationProperties(prefix = “aws.ltbus”)将其初始化到类Ltbus中,也可以@Value一个一个获取配置,但是配置多的情况就显得特别臃肿繁琐。

    @ConfigurationProperties(prefix = "aws.ltbus")
    public class Ltbus {
        String username;
        String password;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    通常这个注解是配合@Component进行使用,不然就没有意义了,因为我们正是需要从配置类中将配置读取到spring的IOC容器中,方便在其他bean类中进行获取使用。如果不加@Component,配置类是没办法加载到容器中的。
    我们也经常看到@ConfigurationProperties和@Configuration配合使用,这里其实跟@Controller/@Service等的意思一样,看一下注解的源码就清楚了(都含有@Component,为了让人直观了解被该注解定义的是个配置类)
    在这里插入图片描述

    2、@EnableConfigurationProperties

    @EnableConfigurationProperties的作用是把springboot配置文件中的值与我们的xxxProperties.java的属性进行绑定,需要配合@ConfigurationProperties使用。
    除了前面提到的@ConfigurationProperties加@Configuration或@Component实现配置文件的容器注入外,还有一种方法就是通过@EnableConfigurationProperties实现,如下代码实现

    @Configuration
    @EnableConfigurationProperties(Ltbus.class)
    public class AwsConfig {
    }
    
    • 1
    • 2
    • 3
    • 4
    @ConfigurationProperties(prefix = "aws.ltbus")
    public class Ltbus {
        String username;
        String password;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    这里要注意,@EnableConfigurationProperties中引用的类一定要加@ConfigurationProperties这个注解,并且不需要再添加@Component注解,不然会导致被@ConfigurationProperties注解的类,在容器中实例化了2个bean对象:1、被@Component实例化注入到容器中,2、被@EnableConfigurationProperties实例化注入到容器中,此时如果我们使用@Aware获取Ltbus类的bean对象,有一定概率会导致程序报错,为什么说有一定概率呢?
    使用@EnableConfigurationProperties往容器中注入的bean,他的bean命名规则是:前缀-类路径
    例如,我们让上面2种情况都加,运行springboot项目,发现容器正常运行,并且Ltbus生成了2个不同名的bean对象
    在这里插入图片描述
    但是我在大型项目中,同样的定义和配置,却报了另外一个错误:在对象注入时,发现有容器中存在2个同名bean对象
    在这里插入图片描述
    有没有大神来解疑一下,springboot版本均是2.1.3-RELEASE,困扰了我2天。

    结尾:
    既然我们知道了问题原因,以后注意使用规范就好了,源码层面有时间还是要追一下代码看看的。

  • 相关阅读:
    青翼科技基于VITA57.1的16路数据收发处理平台产品手册
    科研绿色荧光素标记支链淀粉;FITC-Amylopectin;CY3、CY5、CY5.5、CY7标记支链淀粉/淀粉醣/木葡聚糖
    【数组的使用续篇】
    国家商用密码算法-SM4Tool.jar
    [Android] Amazon 的 android 音视频开发文档
    【我的创作纪念日】一周年随笔
    VS Code使用技巧
    TensorFlow入门(二十、损失函数)
    数据集读取与划分
    react--路由封装
  • 原文地址:https://blog.csdn.net/yuec1998/article/details/126357003