SpringBoot中@ConfigurationProperties注解实现配置绑定的三种方法
作者:YuShiwen? 发布时间:2023-03-19 12:36:25
properties配置文件如下:
human.name=Mr.Yu
human.age=21
human.gender=male
如何把properties里面的配置绑定到JavaBean里面,以前我们的做法如下:
public class PropertiesUtil {
public static void getProperties(Person person) throws IOException {
Properties properties = new Properties();
properties.load(new FileInputStream("src/main/resources/demo.properties"));
//得到配置文件key的名字
Enumeration enumeration = properties.propertyNames();
while (enumeration.hasMoreElements()){
String key =(String)enumeration.nextElement();
String value = properties.getProperty(key);
System.out.println("key="+key+"——————value="+value);
//封装到JavaBean
//以下内容省略
}
}
}
输出结果:
key=human.name——————value=Mr.Yu
key=human.age——————value=21
key=human.gender——————value=maleProcess finished with exit code 0
可以看到这个过程十分繁杂,但是在SpringBoot中这个过程将会变得非常简单。
在SpringBoot中有如下3种方法:
1.@ConfigurationProperties注解+@Component(或@Controller或@Service或@Repository)注解
只有在容器中的组件,才会拥有SpringBoot提供的强大功能,也就是如果我们需要使用到@ConfigurationProperties注解,那么我们首先要保证该对JavaBean对象在IoC容器中,所以需要用到Component注解来添加组件到容器中。
@ConfigurationProperties注解中prefix与value互相都是别名
也就是说
@ConfigurationProperties(value = "human")
与@ConfigurationProperties(prefix = "human")
是一样的prefix和value指的是前缀的意思
代码测试: properties配置文件:
human.name=Mr.Yu
human.age=21
human.gender=male
Person类:
@Component ////只有在容器中的组件,才会拥有SpringBoot提供的强大功能
@ConfigurationProperties(value = "human")
public class Person {
public String name;
public int age;
public String gender;
public Person() {
}
public Person(String name, int age, String gender) {
this.name = name;
this.age = age;
this.gender = gender;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", gender='" + gender + '\'' +
'}';
}
}
测试类如下:
//@Controller
////@ResponseBody以字符串的方式写给浏览器,而不是跳转到某个页面
//@ResponseBody
//@RestController = @Controller + @ResponseBody
@RestController
public class HelloController {
//自动注入属性
@Autowired
Person person;
@RequestMapping("/person")
public Person getPerson(){
return person;
}
}
测试结果:
@ConfigurationProperties注解+@EnableConfigurationProperties注解
这种方式@EnableConfigurationProperties注解一定要在配置类上写,@EnableConfigurationProperties的意思是开启属性配置功能,开启谁的属性配置功能呢,因为我们上面的Person类想进行配置绑定,所以我们在后面加上参数Person.class:@EnableConfigurationProperties(Person.class)
@EnableConfigurationProperties(Person.class)的作用就是把这个Person组件注册到容器中,对象的名称为:human-com.ysw.boot.properties.Person 其中human是@ConfigurationProperties(value = "human")中前缀value的值
在Person类上还是有@ConfigurationProperties注解,这种方式把Person类上的@Component注解换成了配置类上的@EnableConfigurationProperties(Person.class)注解
这种方式主要用在引用第三方包时,比如第三方包中有一个Person类,该类中没有使用@Component,我们也不能够给第三方包中的类加上@Component,这个时候就可以使用在配置类上加上@EnableConfigurationProperties注解的方法。
@ConfigurationProperties注解+@Import注解
使用@Import给容器中自动创建出这个类型的组件、默认组件的名字就是全类名
@Import注解与2中的@ConfigurationProperties注解效果是一样的
只不过他们注册到容器中的名称不同:
@ConfigurationProperties注解注册到容器中对象的名称为:human-com.ysw.boot.properties.Person 其中human是@ConfigurationProperties(value = "human")中前缀value的值
@Import注解注册到容器中对象的名称为:com.ysw.boot.properties.Person
配置类:
Person类:
测试类:
application.properties文件:
server.port=8888
human.name=Mr.Yu
human.age=21
human.gender=male222
测试结果:
来源:https://juejin.cn/post/7088670331543486495


猜你喜欢
- dynamic关键字和动态语言运行时(DLR)是.Net 4.0中新增的功能。什么是"动态"?编程语言有时可以划分为静态
- 相信大家使用多点对图片进行缩放,平移的操作很熟悉了,大部分大图的浏览都具有此功能,有些app还可以对图片进行旋转操作,QQ的大图浏览就可以对
- 本节讲运行在后台服务里的工作请求,如何向发送请求者报告状态。推荐用LocalBroadcastManager发送和接收状态,它限制了只有本a
- 本文实例为大家分享了android实现录屏小功能的具体代码,供大家参考,具体内容如下思路android实现录屏功能有两种方案,一种是直接使用
- 今天在使用Nlog的时候,发现了一个之前没注意的问题。以前,我的app配置文件都是这么写的,当然配置比较多的时候会改用xml。 如
- 最近ui同学使用了一种新字体(锐字锐线怒放黑简) 发现全部切成图片字体 吓死我了unity3d和fairygui搭配使用字体过程1.第一步肯
- 概要应同学邀请,演示如何使用 PyQt5 内嵌浏览器浏览网页,并注入 Javascript 脚本实现自动化操作。下面测试的是一个廉价机票预订
- 一、项目结构二、pom.xml<?xml version="1.0" encoding="UTF-8&q
- 一、 应用程序直接建立数据库连接模型应用程序直接每次访问数据库时,都建立创建一个数据库的链接,这样每次建立这样的连接都需要耗费的资源,当同时
- 一、表白墙简介在表白墙页面中包含三个文本框,分别表示表白者,表白对象,表白内容,在文本框中输入内容之后,内容能够保存,并且在下次启动页面的时
- 题目要求思路一:DFS+序列化设计一种规则将所有子树序列化,保证不同子树的序列化字符串不同,相同子树的序列化串相同。用哈希表存所有的字符串,
- 以前一直使用Hibernate,基本上没用过Mybatis,工作中需要做映射关系,简单的了解下Mybatis的映射。两者相差不多都支持一对一
- 导语如下图所示,这是一个导航选择弹框。进行单项选择,然后会监听回调选择的事件。问题是Android的RadioButton是一般是放在Rad
- 前言制作无边框窗口时,系统自带阴影会消失,这时就需要我自己给窗口添加阴影以防止窗口融入背景。添加阴影的方法很简单,直接用effect就可以了
- 前言这篇文章介绍如何使用Springboot+Junit+Mockito做单元测试,案例选取撮合交易的一个类来做单元测试。单元测试前先理解需
- 经常要检测某些IP地址范围段的计算机是否在线。有很多的方法,比如进入到网关的交换机上去查询、使用现成的工具或者编写一个简单的DOS脚本等等,
- Java线程池并发执行多个任务Java在语言层面提供了多线程的支持,线程池能够避免频繁的线程创建和销毁的开销,因此很多时候在项目当中我们是使
- 背景Android开发中,加载图片过多、过大很容易引起OutOfMemoryError异常,即我们常见的内存溢出。因为Android对单个应
- 在实际业务中,当后台数据发生变化,客户端能够实时的收到通知,而不是由用户主动的进行页面刷新才能查看,这将是一个非常人性化的设计。有没有那么一
- 过早提升(Premature Promotion)提升速率(promotion rate), 用于衡量单位时间内从年轻代提升到老年代的数据量