概述
SpringBoot 默认使用以下 2 种全局的配置文件,其文件名是固定的。
- application.properties
- application.yml
其中,application.yml 是一种使用 YAML 语言编写的文件,它与 application.properties 一样,可以在 Spring Boot 启动时被自动读取,修改 Spring Boot 自动配置的默认值。
一、YAML
1.简介
YAML 全称 YAML Ain't Markup Language,它是一种以数据为中心的标记语言,比 XML 和 JSON 更适合作为配置文件。
想要使用 YAML 作为属性配置文件(以 .yml 或 .yaml 结尾),需要将 SnakeYAML 库添加到 classpath 下,Spring Boot 中的 spring-boot-starter-web 或 spring-boot-starter 都对 SnakeYAML 库做了集成, 只要项目中引用了这两个 Starter 中的任何一个,Spring Boot 会自动添加 SnakeYAML 库到 classpath 下。
下面是一个简单的 application.yml 属性配置文件:
server:
port: 8081
2.语法
YAML 的语法如下:
- 使用缩进表示层级关系。
- 缩进时不允许使用 Tab 键,只允许使用空格。
- 缩进的空格数不重要,但同级元素必须左侧对齐。
- 大小写敏感。
例如:
spring:
profiles: dev
datasource:
url: jdbc:mysql://127.0.01/banchengbang_springboot
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
3.YAML 常用写法
YAML 支持以下三种数据结构:
- 字面量:单个的、不可拆分的值
- 数组:一组按次序排列的值
- 对象:键值对的集合
(1)字面量
字面量是指单个的,不可拆分的值,例如:数字、字符串、布尔值、以及日期等。在 YAML 中,使用“key:[空格]value”的形式表示一对键值对(空格不能省略),
如 url: www.biancheng.net。字面量直接写在键值对的“value”中即可,且默认情况下字符串是不需要使用单引号或双引号的:
name: bianchengbang
若字符串使用单引号,则会转义特殊字符:
name: 'zhangsan n lisi'
输出结果为:
"zhangsan \n lisi"
若字符串使用双引号,则不会转义特殊字符,特殊字符会输出为其本身想表达的含义:
name: "zhangsan n lisi"
输出结果为:
"zhangsan n lisi"
(2)数组
YAML 使用“-”表示数组中的元素,普通写法如下:
pets:
-dog
-cat
-pig
行内写法:
pets: [dog,cat,pig]
(3)对象
在 YAML 中,对象可能包含多个属性,每一个属性都是一对键值对。YAML 为对象提供了 2 种写法。
- 普通写法,使用缩进表示对象与属性的层级关系:
website:
name: bianchengbang
url: www.biancheng.net
- 行内写法:
website: {name: bianchengbang,url: www.biancheng.net}
(4)复合机构
以上三种数据结构可以任意组合使用,以实现不同的用户需求,例如:
person:
name: zhangsan
age: 30
pets:
-dog
-cat
-pig
car:
name: QQ
child:
name: zhangxiaosan
age: 2
4.YAML 组织结构
一个 YAML 文件可以由一个或多个文档组成,文档之间使用“---”作为分隔符,且个文档相互独立,互不干扰。如果 YAML 文件只包含一个文档,则“---”分隔符可以省略:
---
website:
name: bianchengbang
url: www.biancheng.net
---
website: {name: bianchengbang,url: www.biancheng.net}
pets:
-dog
-cat
-pig
---
pets: [dog,cat,pig]
name: "zhangsan n lisi"
---
name: 'zhangsan n lisi'
项目举例:Spring Boot profile文件(六)_人……杰的博客-CSDN博客
5.随机值
Spring Boot的属性配置文件中可以通过${random}
来产生int值、long值或者string字符串,来支持属性的随机值。
# 随机字符串
blog.value=${random.value}
# 随机int
blog.number=${random.int}
# 随机long
blog.bignumber=${random.long}
# 10以内的随机数
blog.test1=${random.int(10)}
# 1-20的随机数
blog.test2=${random.int[1,20]}
二、配置绑定
获取配置参数,需要使用到@ConfigurationProperties或者@Value两个注解。
1.@ConfigurationProperties和@Value
(1)松散绑定(松散语法)
指的是配置文件的中命名规则,比如:
- 小驼峰(标准形式) 形如lastName
- 中环线 last-name
- 下划线 last_name
- 大写建议用下换线 LAST_NAME
举例:
config.test.oldOne=HelloWord:对应的类的属性是oldOne
config.test.old-one=HelloWord:对应的属性是oldOne
config.test.old_one=HelloWord:对应的属性是oldOne
config.test.OLD_ONE=HelloWord:系统推荐写法对应的属性是oldOne
(2)SpEL
Spring 表达式语言(SpEL),在使用的过程中类似于EL表达式,但是需要注意的是,SPEL使用在Spring Config文件中。
格式:使用 #{} 作为界定符,所有在大括号中的字符都将被认为成是 SeEL
作用:
1>.通过 Bean 的 id 对 Bean 进行引用
2>.调用方法以及引用对象中的属性
3>.计算表达式的值
4>.正则表达式的匹配
SpEL 字面值:
1>.整数:<property name="age" value="#{23}"/>
2>.小数:<property name="salary" value="#{2300.55}"/>
3>.科学计数法:<property name="salary" value="#{1e4}"/>
4>.字符串:<property name="empName" value="#{'emp01'}"/> 或 <property name='empName' value='#{"emp01"}'/>
5>.布尔值:<property name="formal" value="#{false}"/>
(3)JSR303数据校验
- 需要导入spring-boot-starter-validation依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
-
在需要使用JSR303数据校验的类上添加
@Validated
注解 -
在需要JSR303数据校验的地方添加JSR303数据校验注解
举例:
//@Email:邮箱格式校验,即name必须是邮箱格式
@Component
@Validated
public class Person {
@Email
private String name;
(4)复杂类型封装
@ConfigurationProperties:
@Value:
三、项目举例
1.项目结构
2.实现代码
MainApplication.java:
package com.xj.main;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
@ComponentScan("com.xj")
@SpringBootApplication
public class MainApplication {
public static void main(String[] args) {
SpringApplication.run(MainApplication.class, args);
}
}
HelloController.java:
package com.xj.controller;
import com.xj.entity.PersonOne;
import com.xj.entity.PersonTwo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class HelloController {
@Autowired
private PersonOne personOne;
@Autowired
private PersonTwo personTwo;
@ResponseBody
@RequestMapping(value = "/personOne")
public PersonOne getPersonOne(){
return personOne;
}
@ResponseBody
@RequestMapping(value = "/personTwo")
public PersonTwo getPersonTwo(){
return personTwo;
}
}
PersonOne.java:
package com.xj.entity;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* @ConfigurationProperties:告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定;
* prefix = "person":配置文件中哪个下面的所有属性进行一一映射
*/
@Component
@ConfigurationProperties(prefix = "person")
public class PersonOne {
private String name;
private Integer age;
private List<String> pets;
private List<String> food;
private Child child;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public List<String> getPets() {
return pets;
}
public void setPets(List<String> pets) {
this.pets = pets;
}
public List<String> getFood() {
return food;
}
public void setFood(List<String> food) {
this.food = food;
}
public Child getChild() {
return child;
}
public void setChild(Child child) {
this.child = child;
}
}
PersonTwo.java:
package com.xj.entity;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
/**
* @Author : xjfu
* @Date : 2022/6/24 9:01
* @Description :
*/
@Component
public class PersonTwo {
@Value("${person.name}")
private String name;
@Value("${person.age}")
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
Child.java:
package com.xj.entity;
public class Child {
private String name;
private Integer age;
private String gender;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
}
application.yml:
person:
name: deva
age: 18
pets: [pig,dog,cat]
food:
- HuiMian
- YouPoMian
- HeLuo
child:
name: ss
age: 13
gender: female
3.运行结果
(1)使用@ConfigurationProperties获取配置信息
(2)使用@Value获取配置信息
四、参考
1.@Value和ConfigurationProperties的区别和使用_MyBlogHiHi的博客-CSDN博客_configurationproperties和value
2.@ConfigurationProperties使用及与@Value对比_shuos_yan的博客-CSDN博客_configurationproperties和value3.Spring基础—— SpEL - 走看看
4.SpringBoot | 第三章:springboot配置详解 | oKong | 趔趄的猿
最后
以上就是标致寒风为你收集整理的Spring Boot配置文件及配置绑定(三)一、YAML二、配置绑定三、项目举例四、参考的全部内容,希望文章能够帮你解决Spring Boot配置文件及配置绑定(三)一、YAML二、配置绑定三、项目举例四、参考所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复