07Spring Boot配置绑定

       所谓“配置绑定”就是把配置文件中的值与 JavaBean 中对应的属性进行绑定。通常,我们会把一些配置信息(例如,数据库配置)放在配置文件中,然后通过 Java 代码去读取该配置文件,并且把配置文件中指定的配置封装到 JavaBean(实体类) 中。

SpringBoot 提供了以下 3种方式进行配置绑定:

  • 使用 @ConfigurationProperties 注解
  • 使用 @Value 注解

@ConfigurationProperties

通过 Spring Boot 提供的 @ConfigurationProperties 注解,可以将全局配置文件中的配置数据绑定到 JavaBean 中。下面我们以 Spring Boot 项目 DemoApplication 为例,演示如何通过 @ConfigurationProperties 注解进行配置绑定。

 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

2. 在 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中使用。

4. 在 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);
    }
}

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

@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

2. 修改 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方法

}

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

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

@Value 与 @ConfigurationProperties 对比

描述

@ConfigurationProperties

@Value

底层框架

Spring Boot

Spring

使用位置

标注在 JavaBean 的类名上

标注在 JavaBean 的属性上

功能不同

用于批量绑定配置文件中的配置

只能一个一个的指定需要绑定的配置

需要setXX()方法

需要

有没有均可

复杂类型属性注入

支持所有类型数据的封装,例如 Map、List、Set、以及对象等;

不支持复杂类型,只支持基本数据类型的封装,例如字符串、布尔值、整数等类型。

松散绑定

支持

例如实体类 Person 中有一个属性为 firstName,那么配置文件中的属性名支持以下写法:

person.firstName

person.first-name

person.first_name

PERSON_FIRST_NAME

不支持

SpEl支持

即${xxx}的EL表达式

不支持

支持,例 @Value("${user.id}") private String id; @Value("${user.name}") private String name; 

应用场景

若专门编写了一个 JavaBean 来和配置文件进行映射,则建议使用 @ConfigurationProperties 注解。

若只是获取配置文件中的某项值,则推荐使用 @Value 注解;

08Spring Boot自定定义配置

https://blog.csdn.net/qq_41946216/article/details/124773553?spm=1001.2014.3001.5501

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spring Boot的动态配置指的是在运行时对应用程序的配置进行修改或更新,而不需要重新启动应用程序。 在面试中,可能会涉及到Spring Boot动态配置的原理、作用以及相关的实现方法。 首先,Spring Boot动态配置的原理是基于Spring框架的属性注入和监听机制。Spring Boot应用程序的配置是通过`application.properties`或`application.yml`文件进行管理的。当应用程序启动时,Spring Boot会读取这些配置文件中的属性值并注入到Spring Bean中,从而实现配置的逻辑。 而动态配置则是通过监听属性值的变化来实现的。Spring Boot提供了`@ConfigurationProperties`注解和`@Value`注解两种常用的配置注入方式。可以通过在配置类中使用`@ConfigurationProperties`注解,将需要动态修改的属性注入到Bean中。然后,通过添加一个监听器,监听属性值的变化,一旦属性值发生改变,就会触发监听事件并重新加载配置。 有多种方法可以实现Spring Boot的动态配置。一种常用的方法是使用Spring Cloud Config服务来集中管理和存储配置,并通过消息总线发送配置变更的通知。另一种方法是使用Spring Cloud Bus,它使用消息代理将配置的变更通知传播给多个实例。 还可以使用第三方的配置中心,如Apache Zookeeper、Consul等来进行动态配置。这些配置中心提供了API来更新和获取配置信息,并且支持监听配置变化的功能。 总之,Spring Boot的动态配置是为了方便应用程序的配置管理和更新,使应用程序在运行时可以灵活地适应不同的配置需求。 ### 回答2: Spring Boot的动态配置是指在应用程序运行时可以根据需要动态更改配置参数,而无需重启应用程序。这种灵活性使得应用程序能够根据环境的变化或者特定的用户需求进行调整和优化。 在Spring Boot中,我们可以通过使用Spring Cloud Config等工具或者自定义实现来实现动态配置Spring Cloud Config是Spring Cloud的一个子项目,它提供了一个集中式的配置管理服务,允许将应用程序的配置文件存储在远程仓库中(如Git或SVN),并在运行时动态地从这些仓库中获取配置。 使用Spring Cloud Config,我们可以将应用程序的配置信息集中管理,而不需要将配置参数硬编码到代码中。通过轮询或者推送的方式,应用程序可以定时或者实时获取最新的配置信息。这样,我们可以在不重新部署应用程序的情况下,更改配置参数,从而使得应用程序可以快速适应环境的变化或者满足特定的需求。 动态配置的好处包括: 1. 避免了重新部署应用程序的麻烦和风险,提高了开发和部署效率。 2. 使得应用程序可以根据不同环境的需要进行配置,达到最佳性能和适应性。 3. 实现了配置信息的集中管理,方便追踪和管理配置变更的历史记录。 但是,动态配置也需要考虑安全性和稳定性的问题。配置信息的修改和获取需要进行权限控制,以防止非法操作。另外,动态配置可能会对应用程序的稳定性造成一定影响,因此在配置更新过程中需要考虑到应用程序可能的异常处理和兼容性。 总之,Spring Boot的动态配置为应用程序提供了更大的灵活性和可维护性,使得应用程序在运行时可以根据需要动态调整参数,从而达到更好的性能和适应性。 ### 回答3: Spring Boot的动态配置是指在程序运行时可以根据需要动态更改配置信息的功能。它通过提供一种灵活的配置机制,使得应用程序的配置可以在不重启应用的情况下进行修改和更新。 在Spring Boot中,可以通过使用@ConfigurationProperties注解来定义配置类,将配置信息映射到该类的属性上。通过@ConfigurationProperties注解,我们可以将外部配置文件中的属性值绑定配置类的属性上。当配置文件中的属性值发生改变时,Spring Boot会自动更新配置类中对应的属性值。 动态配置的优点是可以在应用程序运行时实时修改配置信息,而不需要重启应用程序。这样可以提高应用程序的可扩展性和可维护性。例如,在一个具有高流量访问的网站中,如果需要增加线程池的大小来提高并发处理能力,可以通过修改配置文件中的线程池大小属性来达到目的,而不需要停止应用程序。 在Spring Boot中,可以使用Spring Cloud Config来实现动态配置Spring Cloud Config提供了一种集中化的外部配置管理方案,可以将配置文件存储在Git、SVN或本地文件系统等地方,应用程序可以通过访问配置服务器来获取最新的配置信息。通过Spring Cloud Config,我们可以在运行时修改配置文件,并使得配置信息对应用程序立即生效,实现了动态配置的功能。 总而言之,Spring Boot的动态配置是指在程序运行时可以实时修改配置信息的功能。它通过使用@ConfigurationProperties注解和Spring Cloud Config等机制来实现,提供了一种灵活且方便的方式来管理和更新应用程序的配置信息。这种能力提高了应用程序的可扩展性和可维护性,使得应用程序能够更加灵活地适应不同的环境和需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值