接上篇,我们对SpringBoot有了基本的了解,接下来探究配置文件。
目录
二、配置文件
1. SpringBoot热部署
2. 配置文件
2.1 配置文件的作用
2.2 YAML 配置文件
2.3 YAML 与 XML 比较
3. YAML语法
3.1 键值对
3.2 值的写法
3.3 对象/Map(键值对)
3.4 数组(List、Set)
4. 配置文件值注入
@Value获取值和@ConfigurationProperties获取值比较
4.1 配置文件注入值数据校验
5. 配置文件占位符
5.1 随机数占位符
5.2 默认值占位符
5.3 引用其他配置值的占位符
6. 多配置文件
6.1 多Profile文件
6.2 yml支持多文档块方式
7. 配置文件加载顺序
二、配置文件
1. SpringBoot热部署
spring为开发者提供了一个名为spring-boot-devtools的模块来使Spring Boot应用支持热部署,提高开发者的开发效率,无需手动重启Spring Boot应用。
引入依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
通过ctrl+f9来实施热部署。
2. 配置文件
Spring Boot 使用一个全局的配置文件来调整应用的行为和修改自动配置的默认值。配置文件名是固定的,通常有两个选项:
application.properties
application.yml
2.1 配置文件的作用
配置文件主要用于修改Spring Boot自动配置的默认值。Spring Boot在底层已经为我们自动配置好了很多设置,但通过配置文件,我们可以根据自己的需求进行调整。
2.2 YAML 配置文件
YAML(YAML Ain't Markup Language 或 YAML isn't Markup Language)是一个标记语言,它以数据为中心,比JSON、XML等格式更适合做配置文件。以下是YAML的一些特点:
- 可读性:YAML的格式更加直观和易于阅读,特别是对于复杂的配置数据。
- 简洁性:YAML允许使用缩进来表示层级关系,而不是像XML那样使用标签,这使得配置文件更加简洁。
- 灵活性:YAML支持多种数据类型,包括布尔值、列表、字典等,这使得它在表达配置数据时更加灵活。
2.3 YAML 与 XML 比较
- XML:是一种标记语言,用于定义数据的结构和格式。XML配置文件通常包含大量的标签和属性,这使得文件体积较大,且可读性较差。
- YAML:不是标记语言,它更注重数据本身,而不是数据的呈现方式。YAML文件通常更加简洁,易于编写和阅读。
3. YAML语法
YAML 使用简单的格式来表示复杂的数据结构,其基本语法包括键值对、对象、数组等。
3.1 键值对
- 格式:
key: (空格) value
- 要求:键和值之间必须有一个空格;通过空格的缩进来控制层级关系;左对齐的一列数据表示同一个层级。
- 示例:
3.2 值的写法
- 字面量:普通的值(数字,字符串,布尔值)。
- 字符串:
- 默认不需要引号。
- 使用双引号
""
不会转义特殊字符。 - 使用单引号
''
会转义特殊字符。
- 示例:
name: "zhangsan \n lisi" # 输出:zhangsan 换行 lisi
name: 'zhangsan \n lisi' # 输出:zhangsan \n lisi
3.3 对象/Map(键值对)
- 格式:k: v:在下一行来写对象的属性和值的关系;注意缩进
- 示例:
3.4 数组(List、Set)
- 格式:使用
-
后跟一个值来表示数组中的一个元素。 - 行内写法:在一行内用逗号分隔数组元素。
- 示例:
行内写法:
4. 配置文件值注入
我们可以导入配置文件处理器,以后编写配置就有提示了
<!‐‐导入配置文件处理器,配置文件进行绑定就会有提示‐‐>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring‐boot‐configuration‐processor</artifactId>
<optional>true</optional>
</dependency>
@Value获取值和@ConfigurationProperties获取值比较
什么是松散绑定?
比如我的yml中写的lastName,我们类中属性为last_name,这2个还是可以绑定起来的,不影响赋值。这就是松散绑定。
配置文件yml还是properties他们都能获取到值;
如果说,我们只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value;
如果说,我们专门编写了一个javaBean来和配置文件进行映射,我们就直接使用@ConfigurationProperties;
4.1 配置文件注入值数据校验
- 使用
@Component
注解定义一个Spring组件,该组件用于从配置文件中注入属性值。 - 使用
@ConfigurationProperties
注解将配置文件中的属性映射到Java类的字段上。prefix
属性指定了配置文件中相关属性的前缀。 - 使用
@Validated
注解启用对配置属性的校验。
Person 类定义
@Component
@ConfigurationProperties(prefix = "person")
@Validated
public class Person {
// 使用@Email注解校验邮箱格式
@Email
private String name;
// 可以注入字面量、环境变量、配置文件中的值或SpEL表达式
// @Value("${person.last-name}") 从配置文件中获取lastName的值
// 可以注入字面量或SpEL表达式计算的值
// @Value("#{11*2}") 将age字段设置为22
// 可以注入字面量或配置文件中的布尔值
// @Value("true") 设置boss字段为true
private Integer age;
private Boolean boss;
private Date birth;
private Map<String, Object> maps;
private List<Object> lists;
private Dog dog;
}
此时会报如下错误:
5. 配置文件占位符
5.1 随机数占位符
Spring Boot 允许在配置文件中使用随机数生成器来为属性提供值。这可以通过 ${random.value}
、${random.int}
、${random.long}
等占位符实现。
${random.value}
:生成一个随机数。${random.int}
:生成一个随机的整数。${random.long}
:生成一个随机的长整数。${random.int(10)}
:生成一个0到10之间的随机整数。${random.int[1024,65536]}
:生成一个1024到65536之间的随机整数。
5.2 默认值占位符
如果配置文件中的某个属性没有被设置,可以使用默认值。这可以通过在占位符后面加上冒号和默认值来实现。
person.lastName=张三${random.uuid} #“张三”与一个随机生成的UUID拼接起来
person.age=${random.int} # 如果未设置,将使用一个随机整数
person.birth=2017/12/15 # 设置出生日期为2017年12月15日
person.boss=false # 设置boss属性为false
person.maps.k1=v1 # 在maps Map中,设置k1键的值为v1
person.maps.k2=14 # 在maps Map中,设置k2键的值为14
person.lists=a,b,c # 设置lists属性为包含"a", "b", "c"的列表
5.3 引用其他配置值的占位符
可以在配置文件中引用其他已经配置的值,如果该值不存在,则可以指定一个默认值。
#如果person.hello存在,则使用其值,否则使用"hello",然后加上"_dog"作为person.dog.name的值。
person.dog.name=${person.hello:hello}_dog
#设置person.dog.age的值为15。
person.dog.age=15
6. 多配置文件
6.1 多Profile文件
我们在主配置文件编写的时候,文件名可以是 application-{profile}.properties/yml
默认使用application.properties的配置;
6.2 yml支持多文档块方式
# 这个代表第一个文档块
server:
port: 8085
spring:
profiles:
active: dev # 当需要哪个环境配置的时候,只需要在这里修改值。
---
# 这个代表第二个文档块
server:
port: 8086
spring:
profiles: dev # 指定dev,代表开发环境
---
# 这个代表第三个文档块
server:
port: 8087
spring:
profiles: pro # 指定pro,代表生产环境
代码中一共有三个yml文档块,其中在没有配置spring:profiles:active
的情况下,默认会使用第一个文档块的配置。当在配置的情况下,会根据配置的值去使用哪个yml文档块的配置。
测试:指定dev环境
7. 配置文件加载顺序
springboot默认读取的配置文件名字是:“application.properties”和“application.yml”,默认读取四个位置的文件:根目录下、根目录的config目录下、classpath目录下、classpath目录里的config目录下;
配置文件的读取顺序
根目录/config/application.properties
根目录/config/application.yml
根目录/application.properties
根目录/application.yml
classpath目录/config/application.properties
classpath目录/config/application.yml
classpath目录/application.properties
classpath目录/application.yml
默认可读取的配置文件全部都会被读取合并,按照顺序读取配置,相同的配置项按第一次读取的值为准,同一个目录下properties文件比yml优先读取,通常会把配置文件放到classpath下,一般是resources里;