所谓“配置绑定”就是把配置文件中的值与 JavaBean 中对应的属性进行绑定。通常,我们会把一些配置信息(例如,数据库配置)放在配置文件中,然后通过 Java 代码去读取该配置文件,并且把配置文件中指定的配置封装到 JavaBean(实体类) 中。
SpringBoot 提供了以下 3种方式进行配置绑定:
- 使用 @ConfigurationProperties 注解
- 使用 @Value 注解
@ConfigurationProperties
通过 Spring Boot 提供的 @ConfigurationProperties 注解,可以将全局配置文件中的配置数据绑定到 JavaBean 中。下面我们以 Spring Boot 项目 DemoApplication 为例,演示如何通过 @ConfigurationProperties 注解进行配置绑定。
步骤一:
在 DemoApplication的全局配置文件 application.yml 中添加以下自定义属性。
user:
id: 30
name: "Administrator"
sex: "man"
age: 32
salary: 33000.45
address: "cehngdushi"
jobName: "教师" #或job_name 或 job-name 或 USER_JOB_NAME
hibernate: 2022/09/26
books:
- name: bigdata
price: 32.62
- name: java
price: 72.62
- name: python
price: 102.62
names:
- "jianghuan"
- "xiangjie"
- "taoshi"
#students中的key-value表示学生姓名和学号
students:
key1: 2020120014
key2: 2020120015
key3: 2020120016
key4: 2020120017
步骤二:
在 DemoApplication 项目的 com.example.demo.bean 中创建一个名为 User 的实体类,并将配置文件中的属性映射到这个实体类上,并使用使用注解@Component和注解@ConfigurationProperties(prefix = “user”)。
代码如下
创建Book实体
public class Book {
private String name;
private Double price;
.... 此处省略有参无参构造函数 及 setter、getter方法和toString方法
}
创建User实体类
/**
* 将配置文件中配置的每一个属性的值,映射到这个组件中
*
* @ConfigurationProperties:告诉 SpringBoot 将本类中的所有属性和配置文件中相关的配置进行绑定;
* prefix = "person":配置文件中哪个下面的所有属性进行一一映射
*
* 只有这个组件是容器中的组件,才能使用容器提供的@ConfigurationProperties功能;
*/
@Component
@ConfigurationProperties(prefix = "user")
public class User {
private String id;
private String name;
private String sex;
private Integer age;
private Double salary;
private String address;
private Date hibernate;
private Book[] books;
private List<String> names;
private Map<String,Integer> students; //students中的key-value表示学生姓名和学号
.... 此处省略有参无参构造函数 及 setter、getter方法和toString方法
}
注意:
只有在容器中的组件,才会拥有 SpringBoot 提供的强大功能。如果我们想要使用 @ConfigurationProperties 注解进行配置绑定,那么首先就要保证该对 JavaBean 对象在 IoC 容器中,所以需要用到 @Component 注解来添加组件到容器中。
JavaBean 上使用了注解 @ConfigurationProperties(prefix = “user”) ,它表示将这个 JavaBean 中的所有属性与配置文件中以“user”为前缀的配置进行绑定。
使用@ConfigurationProperties(prefix = “user”)注解,实体类中的驼峰命名属性,可以对应以下三种形式:
- user:
jobName: “教师” - user:
job_name : “教师” - user:
job-name: “教师” - USER_JOB_NAME
其中前三种,名字无论字母大写写都可以进行绑定,成为松散绑定,第四中在properties中使用。
步骤三:
在 DemoApplication 项目的 主启动类 中获取IOC容器,从IOC容器中获取Userbean,通过打印userbean展示配置文件中各个属性值。
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
//1、返回IOC容器
ConfigurableApplicationContext run = SpringApplication.run(DemoApplication.class, args);
//2、查看容器中的组件
User user = run.getBean(User.class);
System.out.println(user);
}
}
步骤四:
重启主启动类进行打印,结果如下图
@Value
当我们只需要读取配置文件中的某一个配置时,可以通过 @Value 注解获取。
- 在 DemoApplication的全局配置文件 application.yml 中配置不变。
user:
id: 30
name: "Administrator"
sex: "man"
age: 32
salary: 33000.45
address: "cehngdushi"
jobName: "教师" #或job_name 或 job-name 或 USER_JOB_NAME
hibernate: 2022/09/26
books:
- name: bigdata
price: 32.62
- name: java
price: 72.62
- name: python
price: 102.62
names:
- "jianghuan"
- "xiangjie"
- "taoshi"
#students中的key-value表示学生姓名和学号
students:
key1: 2020120014
key2: 2020120015
key3: 2020120016
key4: 2020120017
- 修改 Spring Boot 项目 DemoApplication 中的实体类 User 中的代码,使用 @Value 注解进行配置绑定,并去掉注解 @ConfigurationProperties(prefix = “user”) ,代码如下
@Component
public class User {
@Value("${user.id}")
private String id;
@Value("${user.name}")
private String name;
@Value("${user.sex}")
private String sex;
@Value("${user.age}")
private Integer age;
@Value("${user.salary}")
private Double salary;
@Value("${user.address}")
private String address;
@Value("${user.jobName}")
private String jobName;
@Value("${user.hibernate}")
private Date hibernate;
@Value("${user.books}")
private Book[] books;
@Value("${user.names}")
private List<String> names;
@Value("${user.students}")
private Map<String,Integer> students; //students中的key-value表示学生姓名和学号
.... 此处省略有参无参构造函数 及 setter、getter方法和toString方法
}
- 重启主启动类进行打印,结果如下图。
原因:是因为@Value注解只能注入基本数据类型,不能注入对象类型和复杂类型(数组、List集合、Map集合)。
4、修改 Spring Boot 项目 DemoApplication 中的实体类 User 中的代码,去掉books、names、students 上的注解 @Value,代码如下。
@Component
public class User {
@Value("${user.id}")
private String id;
@Value("${user.name}")
private String name;
@Value("${user.sex}")
private String sex;
@Value("${user.age}")
private Integer age;
@Value("${user.salary}")
private Double salary;
@Value("${user.address}")
private String address;
@Value("${user.jobName}")
private String jobName;
@Value("${user.hibernate}")
private Date hibernate;
private Book[] books;
private List<String> names;
private Map<String,Integer> students; //students中的key-value表示学生姓名和学号
.... 此处省略有参无参构造函数 及 setter、getter方法和toString方法
}
5.重新启动主启动类,运行结果如下: