整理自雷丰阳_尚硅谷
Spring Boot配置
配置文件
Spring Boot使用一个全局的配置文件,用于修改SringBoot自动配置的默认值。配置文件名是固定的。
- application.properties
- application.yml
YAML
以前的配置文件大都使用xml文件。YAML以数据为中心,比json,xml更适合做配置文件。xml大量的数据浪费在了标签的开立上。
YAML
server:
prot: 8081
XML:
<server>
<port>8081</port>
</server>
YAML语法
基本语法
- 用k: v表示一对键值对。
- 以空格的缩进来控制层级关系,只要是左对齐的一列数据,就是一个层级的
- 属性和值是大小写敏感的
注: v前面的空格必须有
值的写法
字面量
普通的值(数字,字符串,布尔)
k: v 字面直接来写
注: 字符串不用加单引号或双引号
""双引号:不会转义特殊字符,特殊字符会按照想表示的意思输出
''单引号:会转义特殊字符,特殊字符失去功能,输出字符本体
例:
name: “zhangsan \n lisi” 输出 zhangsan 换行 lisi
name: ‘zhangsan \n lisi’ 输出 zhngsan \n lisi
对象、map(键值对)
也是 k: v 的形式
例:
正常写法
friends:
lastName: zhangsan
age: 20
行内写法
friends: {lastName: zhangsan, age: 20}
数组(List,Set)
用- 值表示数组中的元素
正常写法
pets:
- cat
- dog
- pig
行内写法
pets: [cat, dog, pig]
YAML配置文件值注入
目的:用一个类来接收配置yml文件里的内容
步骤:
- 创建一个接收yml配置的bean类
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String lastName;
private Integer age;
private Boolean boss;
private Date birth;
private Map<String, Object> maps;
private List<Object> lists;
private Dog dog;
- 写配置
person:
lastName: zhangsan
age: 18
boss: false
birth: 2017/12/12
maps: {k1: v1, k2: v2}
lists:
- lisi
- zhaoliu
dog:
name: 好看
age: 2
- 给这个类前面标上
@Component和@ConfigurationProperties(prefix = "person") - 导入配置文件处理器,配置文件进行绑定就会有提示
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
- 测试
解释:
- @ConfigurationProperties
告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定
prefix = "person":配置文件中那个下面的所有属性进行一一映射 - @Component
只有这个组件是容器中的组件,才能用容器提供的@ConfigurationProperties功能 - 测试
Spring Initializer自动创建了test里的单元测试
properties配置文件注入
同上,写application.properties文件的配置
person.last-name=张三
person.age=18
person.birth=2017/12/12
person.boss=false
person.maps.k1=v1
person.maps.k2=v2
person.lists=a,b,c
person.dog.name=dog
person.dog.age=2
注:application.properties默认用ASCII解码,需要设置一下和UTF-8的转换。在IDEA的setting中file encoding,勾上Tansparent native to ascii conversion。
和@Value的区别
@Value的使用
在需要绑定的属性前,注解@Value,括号内填写绑定的值。值可以为字面量、${}从环境变量、配置文件中获取值、#{SpEL}
例:
@Value("${person.last-name}")
@Value("#{11*2}")
@Value(“true”)
和@ConfigurationProperties对比
| @ConfigurationProperties | @Vaue | ||
|---|---|---|---|
| 功能 | 批量注入配置文件中的属性 | 一个个制定 | |
| 松散绑定 | 支持 | 不支持 | |
| SpEL | 不支持 | 支持 | |
| JSR303数据校验 | 支持 | 不支持 | |
| 复杂类型封装 | 支持 | 不支持 |
松散绑定(Relaxed binding)
- person.firstName:标准方式
- person.first-name:大写用-
- person.first_name:大写用_
- PERSON_FIRST_NAME:推荐系统属性使用这种写法
JSR303数据校验
在类名上添加@Validated,在属性上添加@Email
报错处理
报错:
@Email为红
解决:
添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
结论
如果只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value。相当于直接把配置文件中的某个值直接获取到类中某个值。
如果专门写了一个JavaBean来和配置文件映射,就直接使用@ConfigurationProperties
@PropertySource和@ImportResource
@PropertySource
加载指定的配置文件,而@ConfigurationProperties默认从全局配置文件中获取值
@PropertySource(value = {"classpath:person.properties"})
@Component
@ConfigurationProperties(prefix = "person")
//@Validated
public class Person {
@ImportResource
导入spring的配置文件,让配置文件里的内容生效
【跳过,不懂,之后填坑】
配置文件占位符
配置文件中使用随机数
${random.uuid}
${random.int}
${random.long}
${random.int(10)}
${random.int[1024,65536]}
配置文件使用前面的赋值
如果没有,使用:使用默认值
${person.lastName:Peter}
Profile
多profile文件
在注配置文件编写时,文件名可以是 application-{profile}.properties/yml即可以动态切换
激活制定文件
在application.properties/yml中设置spring.profiles.active=dev来激活要使用的配置文件
多文档块
在application.yml文件里用---区分不同文档块
在最上面的文档块里面激活
在下面的文档块中用
spring:
prfiles: dev
来定义文档块名称
例:
server:
port: 8081
spring:
profiles:
active: prod
---
server:
port: 8081
spring:
profiles: dev
---
server:
port: 8082
spring:
profiles: prod
命令行激活
方法1
--spring.profiles.active=dev
在运行里的 Edit Configuration 中的 Program Arguments里添加
方法2
打包,maven->package
命令行运行java -jar xxxx.jar --spring.profiles.active=dev
方法3
虚拟机参数
在运行里的 Edit Configuration 中的 VM options 添加 -Dspring.profiles.active=dev
配置文件加载位置
1. file:./config/
2. file:./
3. classpath:/config/
4. classpath:/
优先级由高到低,高优先级覆盖低优先级;互补配置,四个路径都加载
classpath类路径,是resource文件夹
file当前文件,是最上的文件夹
命令行指定
最优先
打包,maven->package
命令行运行java -jar xxxx.jar --spring.config.location=G:/application.properties
可以运维使用,项目已经打包时,运维时需要更改少量的配置
外部配置加载顺序
从上到下,优先级由高到低,互补配置
1. 命令行参数
2. 由jar包外向jar包内,优先加载带profile的
自动配置原理
SpringBoot有很多自动配置类来接收对应的配置。
@Conditional
判断是否满足后面的条件,如果满足则执行
技巧
在配置中写debug=true,让控制台打印自动配置报告,可以看出哪些自动配置类生效