SpringBoot --> 三、配置文件
ref. 狂神说
文章目录
3. SpringBoot配置文件
3.1 配置文件
**配置文件的作用 :**修改SpringBoot自动配置的默认值,因为SpringBoot在底层都自动配置了。
SpringBoot使用一个全局的配置文件 , 配置文件名称是固定的:
application.properties
语法结构 :key=valueapplication.yml
语法结构 :key:空格 value
比如可以在配置文件中修改Tomcat 默认启动的端口号:
server.port=8555
3.2 yaml
3.2.1 概述
-
YAML,“YAML Ain’t a Markup Language” (YAML不是一种标记语言)。在开发的这种语言时,YAML 的意思其实是:“Yet Another Markup Language”(仍是一种标记语言);
-
以数据作为中心,而不是以标记语言为重点;
-
以前的配置文件,大多数都是使用xml来配置;比如一个简单的端口配置,对比下yaml和xml:
传统xml配置:
<server> <port>8555<port> </server>
yaml配置:
server: prot: 8555
3.2.2 yaml基础语法
语法要求严格!
- 空格不能省略;
- 以缩进来控制层级关系,只要是左边对齐的一列数据都是同一个层级的;
- 属性和值的大小写敏感。
字面量:普通的值(数字,布尔值,字符串)
- 字面量直接写在后面就可以 , 字符串默认不用加上双引号或者单引号;
k: v
- “ ” 双引号,不会转义字符串里面的特殊字符,特殊字符会作为本身想表示的意思;比如 :name: “key \n NG” 输出:key 换行 NG
- ‘’ 单引号,会转义特殊字符,特殊字符最终会变成和普通字符一样输出。比如 :name: ‘key \n NG’ 输出 :key \n NG
对象、Map(键值对)
#对象、Map格式
k:
v1:
v2:
-
在下一行写对象的属性和值的关系,注意缩进;比如:
rapper: name: keyNG age: 19
-
行内写法:
rapper: {keyNG: qinjiang,age: 19}
数组( List、set )
-
用 - 值表示数组中的一个元素,比如:
pets: - cat - dog - pig
-
行内写法
pets: [cat,dog,pig]
3.3 yaml配置文件注入
- yaml文件更强大的地方在于,可以给实体类直接注入匹配值!
一个简单的测试:
-
编写实体类
Person
和Dog
,使用了lombok插件;Person.java
package com.ano.hello.pojo; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; import java.util.Date; import java.util.List; import java.util.Map; @Component //注入bean到容器中 @Data @NoArgsConstructor @AllArgsConstructor public class Person { private String name; private Integer age; private Date birth; private Dog dog; private List<Object> hobbies; private Map<String, Object> scores; }
Dog.java
@Data @NoArgsConstructor @AllArgsConstructor public class Dog { private String name; private Integer age; }
-
使用yaml配置的方式注入Person类,新建并编写配置文件
resources/application.yml
,注意语法;person: name: KeyNG age: 19 birth: 2003/7/28 dog: name: 大头 age: 3 hobbies: - rap - fitness scores: {TOEFL: 112, MATH: 66}
-
使用注解
@ConfigurationProperties
将配置文件中对象的值注入到Person类中;@ConfigurationProperties作用:
将配置文件中配置的每一个属性的值,映射到这个组件中;
告诉SpringBoot将本类中的所有属性和配置文件中相关配置进行绑定;
参数prefix = “xxx” : 将配置文件中的person下面的所有属性一一对应。
@Component @Data @NoArgsConstructor @AllArgsConstructor @ConfigurationProperties(prefix = "person") public class Person { private String name; private Integer age; private Date birth; private Dog dog; private List<Object> hobbies; private Map<String, Object> scores; }
这是会发现springboot有一个报错提示:
-
pom.xml
导入配置文件处理器依赖,解决上述报错提示<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency>
导入后,可以看到配置文件会有提示;
-
在测试类中编写一个测试:
@SpringBootTest class Springboot01HelloApplicationTests { @Autowired Person person; @Test void testPerson(){ System.out.println(person); } }
运行,可以看到所有值注入成功:
3.4 加载指定配置文件
- @ConfigurationProperties(prefix = “xxx”)
- 默认是从全局配置获取;
- 配置文件名只能是
application.yml
; - 优点是只需要配置参数prefix = “xxx”就会自定匹配相对应的属性。
- @PropertySource(value=“xxx”)
- 加载指定的配置文件;
- 缺点是:每个属性需要通过@Value(“${xxx}”)手动注入值。
一个简单测试
-
新建并编写一个配置文件
resources/person.properties
;name= Ano ${random.uuid} age= ${random.int}
使用了
${random.uuid}
和${random.int}
生成随机值; -
在实体类上使用
@PropertySource
加载指定配置文件并注入属性值;@Component @Data @NoArgsConstructor @AllArgsConstructor @PropertySource(value = "classpath:person.properties") public class Person { @Value("${name}") private String name; @Value("${age}") private Integer age; ... }
-
测试程序不变,运行测试:指定配置文件绑定并注入值成功。
3.5 properties和yaml配置文件对比
@ConfigurationProperties | @Value | |
---|---|---|
功能 | 写在实体类上方,批量注入配置文件中的属性值 | 写在属性上方,一个一个注入属性值 |
松散绑定 | 支持 | 不支持 |
SpEL | 不支持 | 支持 |
JSR303数据校验 | 支持 | 不支持 |
复杂类型封装 | 支持 | 不支持 |
- @ConfigurationProperties只需要写一次即可,@Value则需要每个字段都添加;
- 松散绑定: 比如yml中写last-name,和lastName是一样的;
- SpEL:是Spring 表达式语言(简称“SpEL”)是一种强大的表达式语言,支持在运行时查询和操作对象图;
- JSR303数据校验:可以在字段是增加一层过滤器验证,可以保证数据的合法性;
- 复杂类型封装:使用@ConfigurationProperties在yml中就可以封装对象,使用@Value不行;
结论:
-
推荐使用yaml配置文件;
-
如果在某个业务中,只需要获取配置文件中的某个值,可以使用一下 @Value;
-
如果说,专门编写了一个JavaBean来和配置文件进行一一映射,就直接@ConfigurationProperties。