07 SpringBoot 配置绑定

news2025/7/9 5:13:54
	 所谓“配置绑定”就是把配置文件中的值与 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1822256.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TF-IDF算法:从文本中发现价值的黄金法则

TF-IDF算法 一、简介二、TF-IDF算法原理2.1 词频&#xff08;TF&#xff09;2.2 逆文档频率&#xff08;IDF&#xff09;2.3 TF-IDF的计算 三、TF-IDF算法应用3.1 搜索引擎3.2 文本分类3.3 信息提取3.4 文本摘要 四、TF-IDF算法的改进4.1、TF-IDF算法的改进4.1.1. 基于词的权重…

DC12V升压24V/5A电流 布控球产品应用 升压恒压SL4010耐压40V芯片

随着科技的不断发展&#xff0c;布控球作为一种高效、精准的安全监控设备&#xff0c;被广泛应用于公安、消防、交通等多个领域。然而&#xff0c;布控球在工作过程中需要稳定的电源供应&#xff0c;以保证其正常运行和长期稳定性。因此&#xff0c;一款性能优良的升压恒压芯片…

百度地图3.0截图,下载(解决图形下载偏移的问题)

百度地图应用3.0开发的页面&#xff0c;需要截图并下载的功能。前端采用html2canvas生成base64图片 由于百度地图绘制多边形是svg&#xff0c;而html2canvas不支持生成。不绘制线的截图是正常的&#xff0c;绘制了线条就会出现偏移。以下是对比&#xff0c;上一张是正常的&…

深入解析B树:数据结构、存储结构与算法优势

一、引言 在计算机科学中&#xff0c;数据结构和算法是核心内容。它们的选择和应用直接影响程序的效率和性能。B树&#xff08;B-Tree&#xff09;作为一种自平衡的多叉树数据结构&#xff0c;广泛应用于数据库和文件系统中。本文将详细介绍B树的数据结构模型、存储结构&#…

ssm创意商城-计算机毕业设计源码03663

摘要 科技进步的飞速发展引起人们日常生活的巨大变化&#xff0c;电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流&#xff0c;人类发展的历史正进入一个新时代。在现实运用中&#xff0c;应用软件的工作规…

JavaScript快速入门系列-2(JavaScript语言基础)

第二章&#xff1a;JavaScript语言基础 2.1 变量声明&#xff1a;let, const, var2.1.1 变量是什么&#xff1f;2.1.2 var2.1.3 let与const2.1.4 选择哪个关键字&#xff1f; 2.2 数据类型2.2.1 基本数据类型2.2.2 复杂数据类型2.2.3 示例与类型检测 2.3 运算符2.3.1 算术运算符…

C++基础知识(八:STL标准库 Map和multimap )

Map C 标准模板库&#xff08;STL&#xff09;中的 map 容器是一种非常有用的关联容器&#xff0c;用于存储键值对&#xff08;key-value pairs&#xff09;。在 map 中&#xff0c;每个元素都由一个键和一个值组成&#xff0c;其中键是唯一的&#xff0c;而值则可以重复。 基…

来自IEEE编委的发文建议及最佳实践

1.注意关键词(会涉及是否能找到合适的评审人) 2. Intro部分 contribution 通常3-4点 3. 注意文章中的符号使用前后统一 4.需要分析最终的结果(对之后的研究有什么帮助) 5.结论的部分 切忌虎头蛇尾,需要分析优点和缺点 建议未来的研究方向 6.参考文献

2001-2023年上市公司数字化转型测算数据(含原始数据+处理代码+计算结果)

2001-2023年上市公司数字化转型测算数据&#xff08;含原始数据处理代码计算结果&#xff09;&#xff08;吴非&#xff09; 1、时间&#xff1a;2001-2023年 2、来源&#xff1a;上市公司年报 3、指标:行业代码、行业名称、证券简称、是否发生ST或ST或PT、是否发生暂停上市…

max code size exceeded

Warning! Error encountered during contract execution [max code size exceeded] 智能合约编译时提示 contracts/core/CORE.sol:15:1: Warning: Contract code size exceeds 24576 bytes (a limit introduced in Spurious Dragon). This contract may not be deployable on m…

自研一套带双向认证的Android通用网络库

当前&#xff0c;许多网络库基于Retrofit或OkHttp开发&#xff0c;但实际项目中常需要定制化&#xff0c;并且需要添加类似双向认证等安全功能。这意味着每个项目都可能需要二次开发。那么&#xff0c;有没有一种通用的封装方式&#xff0c;可以满足大多数项目需求&#xff1f;…

什么是端口转发?路由器如何正确的设置端口转发和范围转发?(外网访问必备设置)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 端口转发 📒🚀 端口转发的应用场景💡 路由器如何设置端口转发(示例)💡 端口范围转发(示例)🎯 范围转发的应用场景🛠️ 设置范围转发📝 范围转发实操示例🎈 注意事项 🎈⚓️ 相关链接 ⚓️📖 介绍 📖 …

如何平衡安全访问和办公效率?零信任安全×统一身份才是解决之道

在远程办公、混合办公、跨团队协作日益频繁的今天&#xff0c;企业的业务开展需要支持多种访问接入的需求和场景。如何平衡企业数据的安全访问和办公效率将成为挑战。 在业务的多种接入场景上&#xff0c;企业引入零信任&#xff08;Zero Trust&#xff0c;ZT&#xff09;产品…

鸿蒙用 BuilderParam 实现同一个布局不同内容组件

面通过一个案例展示BuilderParam的具体用法&#xff0c;例如&#xff0c;现需要实现一个通用的卡片组件&#xff0c;如下图所示 卡片中显示的内容不固定&#xff0c;例如 具体实现代码如下&#xff1a; Entry Component struct BuildParamDemo {build() {Column(){Card() {imag…

aac如何转化mp3?超好用的四种音频转换方法!

aac如何转化mp3&#xff1f;AAC格式可能鲜为人知&#xff0c;但实际上它是一种音频文件格式&#xff0c;然而&#xff0c;AAC的应用却不太广泛&#xff0c;这并非偶然&#xff0c;首先&#xff0c;使用AAC需要支付专利费用&#xff0c;这对于个人和公司都可能是一笔不小的开支&…

【网络安全】【深度学习】【入侵检测】SDN模拟网络入侵攻击并检测,实时检测,深度学习【一】

文章目录 1. 前言2. Mininet 和 Ryu 的区别2.1 Mininet2.2 Ryu2.3 总结 3. 模拟攻击3.1 环境准备3.2 创建 Mininet 网络拓扑3.2 启动 Ryu 控制器3.3 模拟网络攻击3.4 捕获流量 4. 实时异常检测4.1 在 Ryu 控制器中4.2 在 h2 机器上的实验结果4.3 深度学习模型部署上h2机器 帮助…

Git保姆级教程

目录 Git是什么&#xff0c;为什么要学这个工具&#xff1f; 码云注册并创建仓库 Git安装 查看本地仓库状态 添加到暂存区 提交到本地库 修改文件 版本回退 创建、切换和删除分支 合并分支 克隆远端库到本地 将本地库推送到远端库 命令设置别名 Git是什么&#xf…

Qt 竖排文字研究(一)

在传统的编程环境中&#xff0c;代码的排列方式通常是水平的&#xff0c;这是基于我们日常的阅读习惯和编程规范。但是&#xff0c;当我们尝试打破这一常规&#xff0c;将代码字符以竖排的方式呈现时&#xff0c;发现没有什么现成有效的方式。所以本文基于Qt 的场景视图下&…

水表摄像直读抄表仪

1.技术性简述 水表摄像直读抄表仪&#xff0c;是一种前沿的智能计量机器设备&#xff0c;它利用超清摄像头部和图像识别算法&#xff0c;完成了远程控制、非接触的水表载入。这一技术的普及&#xff0c;颠覆了传统式人力抄表的形式&#xff0c;提高了效率&#xff0c;降低了不…

eclipse如何导入springboot项目

打开eclipse 找到你的springboot项目 点击finish即可 test02就已经导入进去了 配置一下maven 在将那个springboot项目刷新一下即可 运行成功