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

Posted 百里东君~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了@EnableConfigurationProperties和@ConfigurationProperties用法及注意事项相关的知识,希望对你有一定的参考价值。

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

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

1、@ConfigurationProperties

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

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

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

@ConfigurationProperties(prefix = "aws.ltbus")
public class Ltbus 
    String username;
    String password;

通常这个注解是配合@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 

@ConfigurationProperties(prefix = "aws.ltbus")
public class Ltbus 
    String username;
    String password;

这里要注意,@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天。

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

以上是关于@EnableConfigurationProperties和@ConfigurationProperties用法及注意事项的主要内容,如果未能解决你的问题,请参考以下文章