07 SpringBoot 配置绑定

	 所谓“配置绑定”就是把配置文件中的值与 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);
    }
}

步骤四:

重启主启动类进行打印,结果如下图

img

@Value

当我们只需要读取配置文件中的某一个配置时,可以通过 @Value 注解获取。

  1. 在 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
  1. 修改 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方法
 
}
  1. 重启主启动类进行打印,结果如下图。

img

原因:是因为@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.重新启动主启动类,运行结果如下:

img

@Value 与 @ConfigurationProperties 对比

image-20221012114630282

image-20221012114653261

相关推荐

  1. vue数据

    2024-06-17 15:40:03       39 阅读
  2. vuekey

    2024-06-17 15:40:03       18 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-17 15:40:03       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-17 15:40:03       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-17 15:40:03       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-17 15:40:03       18 阅读

热门阅读

  1. 如何在Unix系统上安装Perl?

    2024-06-17 15:40:03       6 阅读
  2. 一次关于JVM的面试经历,安卓开发快速学习

    2024-06-17 15:40:03       7 阅读
  3. Web前端编辑器:探索其深度与广度

    2024-06-17 15:40:03       6 阅读
  4. 【Python】在 Pandas 中使用 AdaBoost 进行分类

    2024-06-17 15:40:03       9 阅读
  5. ElasticSearch聚合排序

    2024-06-17 15:40:03       7 阅读
  6. MySQL触发器基本结构

    2024-06-17 15:40:03       9 阅读
  7. 【Elasticsearch】索引快照并还原到其他集群

    2024-06-17 15:40:03       8 阅读
  8. 企业微信hook接口DLL调用(4.1.22.6009版本)

    2024-06-17 15:40:03       7 阅读
  9. PostgreSQL的系统视图pg_policies

    2024-06-17 15:40:03       7 阅读
  10. 给wordpress添加限制游客浏览数量功能

    2024-06-17 15:40:03       7 阅读