所谓“配置绑定”就是把配置文件中的值与 JavaBean 中对应的属性进行绑定。通常,我们会把一些配置信息(例如,数据库配置)放在配置文件中,然后通过 Java 代码去读取该配置文件,并且把配置文件中指定的配置封装到 JavaBean(实体类) 中。
SpringBoot 提供了以下 3种方式进行配置绑定:
- 使用 @ConfigurationProperties 注解
- 使用 @Value 注解
@ConfigurationProperties
通过 Spring Boot 提供的 @ConfigurationProperties 注解,可以将全局配置文件中的配置数据绑定到 JavaBean 中。下面我们以 Spring Boot 项目 DemoApplication 为例,演示如何通过 @ConfigurationProperties 注解进行配置绑定。
步骤一:
在 DemoApplication的全局配置文件 application.yml 中添加以下自定义属性。
user:id: 30name: "Administrator"sex: "man"age: 32salary: 33000.45address: "cehngdushi"jobName: "教师" #或job_name 或 job-name 或 USER_JOB_NAMEhibernate: 2022/09/26books:- name: bigdataprice: 32.62- name: javaprice: 72.62- name: pythonprice: 102.62names:- "jianghuan"- "xiangjie"- "taoshi"#students中的key-value表示学生姓名和学号students:key1: 2020120014key2: 2020120015key3: 2020120016key4: 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: 30name: "Administrator"sex: "man"age: 32salary: 33000.45address: "cehngdushi"jobName: "教师" #或job_name 或 job-name 或 USER_JOB_NAMEhibernate: 2022/09/26books:- name: bigdataprice: 32.62- name: javaprice: 72.62- name: pythonprice: 102.62names:- "jianghuan"- "xiangjie"- "taoshi"#students中的key-value表示学生姓名和学号students:key1: 2020120014key2: 2020120015key3: 2020120016key4: 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.重新启动主启动类,运行结果如下: