SpringBoot_配置
配置文件
SpringBoot使用一个全局的配置文件,全局配置文件的名称是固定的:application.properties或者application.yml;
配置文件的作用: 修改 SpringBoot 自动配置的默认值;
YAML
yml 是 YAML 语言的文件,以数据为中心,比 json 和xml 等更适合做配置文件;
配置格式:
<!--xml格式-->
<server>
<port>8081</port>
</server>
<!--properties格式-->
server.port=8081
<!--yml格式-->
server:
port: 8081
基本语法:
k:(空格)v:表示一对键值对(空格必须有) |
使用缩进表示层级关系 |
缩进时不允许使用Tab键,只允许使用空格 |
缩进空格数目不重要,只要相同层级的元素左侧对齐即可 |
大小写敏感 |
示例:
server:
port: 8081
path: /hello
值的写法:
1,字面量: 普通值,包括 数字、字符串、布尔、日期
说明 | 示例 |
---|---|
k: v 字面格式直接来写 | name: youyou |
字符串默认不用加上单引号或者双引号 | |
" " :双引号;不会转义字符串里面的特殊字符,特殊字符会作为本身想表示的意思 | name: “youyou \n meimei” 等同于 youyou 换行 meimei |
’ ’ :单引号;会转义特殊字符,特殊字符最终只是一个普通的字符串数据 | name: ‘youyou \n meimei’ 等同于 youyou \n meimei |
2,对象(Map):
k: v:在下一行来写对象的属性和值的关系(注意缩进);
基本写法示例:
friends:
lastName: meimei
age: 20
行内写法示例:
friends: {lastName: meimei,age: 20}
3,数组: 包括 List、Set
用 -值表示数组中的一个元素;
基本写法示例:
pets:
‐ cat
‐ dog
‐ pig
行内写法示例:
pets: [cat,dog,pig]
复合结构示例:
<!--javaBean对象-->
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 Cat cat;
...
}
public class Cat {
private String name;
private Integer age;
...
}
<!--application.yml-->
person:
lastname: youyou
age: 18
boss: false
birth: 2020/02/25
maps:
k1: v1
k2: v2
lists:
- liangliang
- meimei
- xiaoxiao
cat:
name: 七月
age: 01
配置文件值注入:
@ConfigurationProperties 进行值注入
/**
* 将配置文件中配置的每一个属性的值,映射到这个组件中
* @ConfigurationProperties:告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定;
* prefix = "person":配置文件中 person 下面的所有属性进行一一映射
*
* 只有这个组件是容器中的组件,才能使用容器提供的@ConfigurationProperties功能;
* @ConfigurationProperties(prefix = "person")默认从全局配置文件中获取值;
*
*/
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
...
Person.java 文件可能有以下提示:
导入配置文件处理器:
<!‐‐导入配置文件处理器,编写配置文件进行绑定就会有提示‐‐>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring‐boot‐configuration‐processor</artifactId>
<optional>true</optional>
</dependency>
@Value 和 @ConfigurationProperties 区别
@Value | @ConfigurationProperties | |
---|---|---|
功能 | 一个个指定 | 批量注入配置文件中的属性 |
松散绑定(松散语法) | 不支持 | 支持 |
SpEL | 支持 | 不支持 |
JSR303数据校验 | 不支持 | 支持 |
复杂类型封装 | 不支持 | 支持 |
注意点:
只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用 @Value ;
专门编写了一个 javaBean 来和配置文件进行映射,我们就直接使用 @ConfigurationProperties ;
@PropertySource & @ImportResource
@PropertySource: 加载指定的配置文件;
<!--加载resources目录下的person.properties配置文件-->
@PropertySource(value = {"classpath:person.properties"})
@ImportResource: 导入 Spring 的配置文件,让配置文件里面的内容生效;
Spring Boot 里面没有 Spring 的配置文件,我们自己编写的配置文件,也不能自动识别;使用@ImportResource 让 Spring 的配置文件生效,加载进来;
<!--resources目录下的beans.xml为Spring的配置文件-->
@ImportResource(locations = {"classpath:beans.xml"})
配置文件占位符
Profile
多Profile文件 :
1,在主配置文件编写的时候,文件名可以是 application-{profile}.properties/yml;
2,默认使用application.properties的配置;
3,激活对应的profile:在默认配置文件中指定 spring.profiles.active= {profile}(对应的配置文件名)
yml支持多文档块方式:
server:
port: 8081
spring:
profiles:
active: prod #指定激活哪个环境的配置信息
‐‐‐
server:
port: 8083
spring:
profiles: dev #指定属于哪个环境
‐‐‐
server:
port: 8084
spring:
profiles: prod #指定属于哪个环境
配置文件加载位置
扫描路径 | 1, –file:./config/ ;2, –file:./ ;3, –classpath:/config/ ; 4,–classpath:/ ; |
优先级 | 由高到底,高优先级的配置会覆盖低优先级的配置; |
说明 | 从这四个位置全部加载主配置文件,互补配置 ;可以通过 spring.config.location 改变默认的配置文件位置; |
外部配置加载顺序
SpringBoot也可以从以下位置加载配置; 优先级从高到低;高优先级的配置覆盖低优先级的配置,所有的配置会形成互补配置;
优先级 | 加载位置 | |
---|---|---|
1 | 命令行参数 | |
2 | 来自 java:comp/env 的 JNDI 属性 | |
3 | Java系统属性(System.getProperties()) | |
4 | 操作系统环境变量 | |
5 | RandomValuePropertySource 配置的 random.* 属性值 | |
6 | jar包外部的 application-{profile}.properties 或 application.yml (带spring.profile)配置文件 | |
7 | jar包内部的 application-{profile}.properties 或 application.yml (带spring.profile)配置文件 | |
8 | jar包外部的 application.properties 或 application.yml (不带spring.profile)配置文件 | |
9 | jar包内部的 application.properties 或 application.yml (不带spring.profile)配置文件 | |
10 | @Configuration 注解类上的 @PropertySource | |
11 | 通过 SpringApplication.setDefaultProperties 指定的默认属性 |