SpringBoot中@ConfigurationProperties注解的常见使用(学习笔记)
admin
2024-03-23 20:20:32
0

1、@ConfigurationProperties注解的概述

  @ConfigurationProperties是springboot提供读取配置文件的一个注解。其对应的bean的后置处理器为
ConfigurationPropertiesBindingPostProcessor类,它是实现了BeanPostProcessor接口,在bean被实例化后,会调用后置处理,递归的查找属性,通过反射注入值,对大多数属性而言强制需提供其setter和getter方法。

  @ConfigurationProperties注解加载配置文件三种常见的用法,如下:

  1. @ConfigurationProperties配合@Component注解在Bean类上使用
  2. @ConfigurationProperties配合@Bean注解在配置类的Bean定义方法上使用
  3. @ConfigurationProperties配合@EnableConfigurationProperties使用

2、配合@Component注解在Bean类上使用

  这里需要注意的是,@ConfigurationProperties注解不仅可以配合@Component注解使用,同时还可以配合继承了@Component注解的其他注解,比如@Controller、@Service、@Repository等,当然这些个注解都有固定的使用常见,所以很少配合@ConfigurationProperties使用,但是配合@Configuration注解使用的情况还是比较常见的,而@Configuration注解也继承了@Component注解。

  具体使用方法如下,这里对应的属性值可以是简单字符串,Map对象、List对象等:

@Slf4j
@Getter
@Setter
@ConfigurationProperties(prefix = MultiDataSourceProperties.PREFIX)
@Configuration
public class MultiDataSourceProperties {public static final String PREFIX = "spring.datasource.multi";/*** 必须设置默认的库,默认master*/private String primary = "master";private Map datasource = new LinkedHashMap<>();}

3、配合@Bean注解在配置类的Bean定义方法上使用

  @Configuration注解的配置类中通过@Bean注解在某个方法上将方法返回的对象定义为一个Bean,并使用配置文件中相应的属性初始化该Bean的属性。

@Configuration
public class DataSourceConfig {@Primary@Bean(name = "primaryDataSource")@ConfigurationProperties(prefix="spring.datasource.primary")public DataSource primaryDataSource() {return DataSourceBuilder.create().build();}
}

4、配合@EnableConfigurationProperties使用

  使用@ConfigurationProperties注解到普通类,然后再通过@EnableConfigurationProperties定义为Bean。

  下面示例和前面的代码类似,但是这里没有使用@Configuration注解,而是在MultiDataSourceAutoConfiguration配置类中使用@EnableConfigurationProperties注解进行配置。

@Slf4j
@Getter
@Setter
@ConfigurationProperties(prefix = MultiDataSourceProperties.PREFIX)
public class MultiDataSourceProperties {public static final String PREFIX = "spring.datasource.multi";/*** 必须设置默认的库,默认master*/private String primary = "master";private Map datasource = new LinkedHashMap<>();
}@Configuration
@EnableConfigurationProperties(MultiDataSourceProperties.class)
public class MultiDataSourceAutoConfiguration {private final MultiDataSourceProperties properties;public MultiDataSourceAutoConfiguration(MultiDataSourceProperties properties) {this.properties = properties;}}

5、@ConfigurationProperties 注解 与 @Value注解

  @ConfigurationProperties注解 和 @Value注解 都可以实现读取配置文件值注入到JavaBean,但是在用法上有一些区别:

  1. 使用位置
    @ConfigurationProperties标注在JavaBean的类名上;而@Value标注在JavaBean的属性上。
  2. 注入参数功能
    @ConfigurationProperties 注解,可以批量注入配置文件中的属性;@Value注解,只能一个一个来指定。
  3. 松散绑定
    松散绑定,即:如果你的属性为 lastName 这种格式,你可以通过 last-name 的方式成功绑定,反之亦可成功绑定。(驼峰编写,会自动转成-小写字母的方式;-小写字母的方式也会识别成驼峰,本质就是两个能相互被识别。@ConfigurationProperties 注解,支持松散绑定;@Value注解,就不支持松散绑定了,必须是一模一样的名称,才可以正常绑定。
  4. EL表达式
    @ConfigurationProperties 注解,不支持EL表达式,此处不作介绍。 但是 @Value 是可以支持 EL 表达式。
  5. JSR303数据校验
    @ConfigurationProperties 注解,支持 JSR303 数据校验;@Value注解,不支持JSR303数据校验。
  6. 复杂类型封装
    @ConfigurationProperties 注解,支持复杂类型(对象等)的直接封装;@Value注解,不支持复杂类型封装。

关于@ConfigurationProperties 注解 与 @Value注解更详细的对比可以参考《注解@ConfigurationProperties 和 @Value 对比》。

6、Not registered via @EnableConfigurationProperties or marked as Spring component 报错

  在使用@ConfigurationProperties 注解时,出现“Not registered via @EnableConfigurationProperties or marked as Spring component”报错信息时,说明没有正确使用该注解,主要是没有在使用@ConfigurationProperties 注解的类上配合使用@Component注解使用或者没有配合@EnableConfigurationProperties这个注解进行注册为属性配置的类。

相关内容

热门资讯

女朋友快生日了我不在她身边想说... 女朋友快生日了我不在她身边想说几句浪漫点得祝福语,请各位帮忙...亲爱的,距离永远阻挡不了我对你爱,...
我18岁了,想献血,请问献血有... 我18岁了,想献血,请问献血有什么规定?无传染性疾病
即便心再痛,也愿意因为爱而停下... 即便心再痛,也愿意因为爱而停下来等待前任回头的星座有哪些?摩羯座,金牛座还有白羊座就这个星座他是非常...
第一个字是从的成语大全,从字开... 第一个字是从的成语大全,从字开头的四字词语 第一个字是从的成语大全 从容应对、 从容自若、 从天...
谁能给我紫藤萝瀑布课后练习第1... 谁能给我紫藤萝瀑布课后练习第1题的答案!自己写。原先,焦虑和悲痛“一直压在我心上”,在繁花盛开的藤萝...
冷笑话的定义是什么? 冷笑话的定义是什么?怎么样的话才算冷笑话?不好笑的笑话吧.定义1:就是讲的人挺平静的,基本上面无表情...
感觉自己失去了目标,现在不知道... 感觉自己失去了目标,现在不知道该怎么生存下去了。人生中没有一帆风顺,现成的路可走,总会遇到一些困难,...
我都24了,还没有男朋友,我真... 我都24了,还没有男朋友,我真的很慌。怎么办?身边也没有男生说喜欢我你愿意网恋吗缘分 不要宅在家里那...
我有一个朋友,我们总是出去玩,... 我有一个朋友,我们总是出去玩,喝酒。但是他每次出来都要炫耀他赚了多少钱,我觉得他很爱炫,我就不想和炫...
林永健拍过什么电视剧 林永健拍过什么电视剧金婚喜耕田的故事城里城外马文的战争
斑马s6有必要学吗 斑马s6有必要学吗有。1、激发兴趣:通过有趣的故事、游戏和其他互动活动,斑马儿童英语S6可以激发孩子...
甜蜜乐章 撮合不了子奇和慕容啊... 甜蜜乐章 撮合不了子奇和慕容啊~~~~!必须是金曲奖的最佳演唱人,不然触发不了
暮光之城3 暮光之城3现在没有出呢!有也是骗人的!起码要国内上映之后吧!我和你一样期待呢!
学生会查寝收走了东西,要用什么... 学生会查寝收走了东西,要用什么法律武器把收走的东西要回来?和学校讲法律,劝你还是别这么冲动了。拿到明...
信任无价主要讲了一个什么故事 信任无价主要讲了一个什么故事主要讲了:一位女老师通过绝食的办法,让那位偷了快译通的学生自己主动交出。
什么叫奴隶社会 什么叫奴隶社会 奴隶社会:从公元前21世纪夏朝建立开始,到公元前221年秦王嬴政统一中国结束。[1...
中级经济师人力资源专业怎么才能... 中级经济师人力资源专业怎么才能考过啊?只是看指定的那两本书《经济基础》和《人力资源管理》,然后再把上...
为什么海里都是水啊 为什么海里都是水啊海里没水 海就不叫海了不难怎么叫海水 嘿嘿。海里没水 海就不叫海了
14岁两个女生,一米深的河里手... 14岁两个女生,一米深的河里手绑手溺亡,疑点重重,怎么回事?这个是因为她们忍受不了家里面的重男轻女,...
帮解几道五年级数学题!急急急~... 帮解几道五年级数学题!急急急~快快快!(要解)52=2*2*13