在开发过程中,我们经常看到以下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天。
结尾:
既然我们知道了问题原因,以后注意使用规范就好了,源码层面有时间还是要追一下代码看看的。
原文转载:https://blog.csdn.net/yuec1998/article/details/126357003