Spring Boot yaml配置文件解析
1、Spring Boot 配置文件类型和作用
Spring Boot 使用一个全局的配置文件,配置文件名称是固定的: application*.yml|yaml|properties
。
Spring Boot 是基于约定的,所以很多配置都有默认值,配置文件的作用就是修改 Spring Boot 自动配置的默认值。
若想使用自定义的配置替换默认配置,可以编写 application.properties 或 application.yaml(application.yml)配置文件进行配置。
- application.yaml(Spring Boot 官方推荐这种)
- 语法结构 :key:空格value
- application.properties
- 语法结构 :key=value
2、yaml 配置文件简介
yaml 文件格式是 YAML Aint Markup Language 编写的,是一种直观的能够被电脑识别的数据序列化格式。
yaml 文件容易被人类阅读,容易和脚本语言交互的,可以被支持 yaml 库的不同的编程语言程序导入,比如: C,Python,Java 等。
yaml 文件是以数据为核心的,比传统的 xml 方式更加简洁。
yaml 文件的扩展名可以使用 .yml 或者 .yaml。
3、yaml 基础语法
语法要求严格:
1、空格不能省略;
2、以缩进来控制层级关系,只要是左边对齐的一列数据都是同一个层级的;
3、属性和值的大小写都是十分敏感的。
3.1、配置【基本】数据类型
【语法】
key: value
【示例】
# 基础类型赋值 String,int,boolean,Date... name: 张三 age: 23 happy: true birthday: 2021/7/24
【注意】
- 字符串默认不用加引号;
- " ",双引号不会转义字符串中的特殊字符,特殊字符会作为本身表示的意思;例:Spring \n Boot,输出:Spring 换行 Boot
- ' ' ,单引号会转义特殊字符,特殊字符会作为普通字符一样输出。例:Spring \n Boot,输出:Spring \n Boot
3.2、配置【Object、Map】数据类型
【语法】
key: value1: ×× value2: ×× ...
【示例】
# 写法1 object_map_1: name: 张三 age: 23 # 写法2 object_map_2: {name: 张三, age: 20}
3.3、配置【Array、List、Set】数据类型
【语法】
key: - value1 - value2 ...
【示例】
# Array、List、Set 中存放基本类型 # 写法1 array_list_set_1: - 张三 - 李四 # 写法2 array_list_set_2: - 张三 - 李四 # Array、List、Set 中存放对象类型 array_list_set_3: - student1: name: 张三 age: 23 - student2: name: 李四 age: 24
【说明】- 表示 Array、List、Set 中的一个元素。
3.4、配置【占位符】
【示例】
key1: value1_${random.uuid} # 随机 uuid key2: value2_${random.int} # 随机 int key3: value3_${person.key3:other} # key3 存在取 key3 的值,不存在值为:other
3.5、配置【松散绑定】
【语法】
stringKey1: value1 string-key2: value2
【说明】string-key2 等于 stringKey2,相当于驼峰命名。
4、yaml 注入配置文件
yaml 文件强大的地方在于可以给实体类直接注入匹配值。
4.1、创建 Spring Boot 项目
无需引入其它坐标,默认项即可。略...
4.2、创建两个实体类
public class Student { private String name; private Integer age; // 有参无参构造方法,get|set|toString方法 }
/* @ConfigurationProperties 作用: 将配置文件中配置的每一个属性的值,映射到这个组件中; 告诉 Spring Boot 将本类中的所有属性和配置文件中相关的配置进行绑定 参数 prefix = "person":将配置文件中的 person 下面的所有属性一一对应 */ @Component @ConfigurationProperties(prefix = "person") public class Person { // 基本类型 private String name; private Integer age; private Boolean happy; private Date birthday; // Object、Map 类型 private Student student; private Map<String, Object> map; // Array、Set、List 类型存放基本数据类型 private String[] array; private Set<Object> set; private List<Object> list; // Array、Set、List 类型存放对象数据类型 private List<Student> array_set_list; // 占位符 private List<Object> placeholder; // 松散绑定 private String humpNamed1; private String humpNamed2; }
此时 Person 类有爆红提示。
【注意】点击打开文档后,该地址中的 Spring Boot 版本可能会找不到页面,切换一个版本即可。
【示例】将 2.5.3 改为 2.2.3.RELEASE https://docs.spring.io/spring-boot/docs/2.5.3/reference/html/appendix-configuration-metadata.html#configuration-metadata-annotation-processor
查看文档,找到一个依赖,在 pom.xml 中引入依赖之后,Person 类中不再爆红提示,点击 Hide notification 隐藏通知,需重启 IDEA 配置注解处理器即可生效。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency>
4.3、创建配置文件
将 src/main/resources 目录下 application.properties 文件删除,新建 application.yaml 文件。
Person: # 基本数据类型 name: 刘一 age: 21 happy: false birthday: 2021/7/24 # Object、Map 类型 student: name: 陈二 age: 22 map: key1: 张三 key2: name: 李四 age: 24 # Array、Set、List 类型存放基本数据类型 array: - 王五 - 25 set: - 赵六 - 26 list: - 孙七 - 27 # Array、Set、List 类型存放对象数据类型 array_set_list: - name: 周八 age: 28 - name: 吴九 age: 29 # 占位符 placeholder: - 占位符_${random.uuid} # 随机 uuid - ${random.int} # 随机 int - 北涯_${Person.name:other} # name 存在取 name 值,name 不存在取值:other - 北涯_${Person.name2:other} # name2 存在取 name2 值,name2 不存在取值:other # 松散绑定 humpNamed1: 驼峰命名1 hump-named2: 驼峰命名2
4.4、测试
@SpringBootTest class SpringbootYamlApplicationTests { @Autowired private Person person; @Test void contextLoads() { System.out.println("person = " + person.toString()); } }
【运行】
person = Person(name=刘一, age=21, happy=false, birthday=Sat Jul 24 00:00:00 CST 2021, student=Student(name=陈二, age=22), map={key1=张三, key2={name=李四, age=24}}, array=[王五, 25], set=[赵六, 26], list=[孙七, 27], placeholder=[占位符_d95cca6a-ddad-4942-93ad-a7a75ce1f922, -19950, 北涯_刘一, 北涯_other], humpNamed1=驼峰命名1, humpNamed2=驼峰命名2)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)