springboot配置文件(.yml/.yaml.properties)
YAML(YAML Ain't Markup Language)
YAML A Markup Language:是一個標記語言
YAML isn't Markup Language:不是一個標記語言;
標記語言:
以前的配置文件;大多都使用的是 xxxx.xml文件;
YAML:以數據為中心,比json、xml等更適合做配置文件;
springboot配置文件的加載有先后順序:
1.application.yml
2.application.yaml
3.application.properoties
后加載的會把先加載的給覆蓋掉,也就是后面的配置會覆蓋前面的配置。
1、YAML基本語法
- 使用縮進表示層級關系
- 縮進時不允許使用Tab鍵,只允許使用空格
- 縮進的空格數目不重要,只要相同層級的元素左側對齊即可
- 大小寫敏感
2、YAML 支持的三種數據結構
- 對象:鍵值對的集合
- 數組:一組按次序排列的值
- 字面量:單個的、不可再分的值
yaml配置舉例
//對象(Map)的寫法
people:
id: 123
age: 22
name: "jason"
//數組的寫法,一組連詞線(-)開頭的行,構成一個數組
-name: sprinboot yaml
status: 2
license: MIT
language: java
可以任意的組合,只要符合語法規范即可。
---------------------------------
字面量
•數字、字符串、布爾、日期
•字符串
–默認不使用引號
–可以使用單引號或者雙引號,單引號會轉義特殊字符
–字符串可以寫成多行,從第二行開始,必須有一個單空格縮進。換行符會被轉為空格。
–文檔
•多個文檔用---隔開
注意:
Spring Boot使用snakeyaml 解析yml文件;https://bitbucket.org/asomov/snakeyaml/wiki/Documentation#markdown-header-yaml-syntax參考語法
#普通數據的配置(冒號之后要有空格)
name: jason
#對象的配置
person:
name: jason
age:22
addr:chengdu
#對象的行內配置(行內對象冒號之后也要有空格)
person: {name: jason,age: 18,addr: chengdu}
#配置數據、集合(配置普通字符串),記得中間加空格
city:
- beijing
- tianjin
- shanghai
- chongqing
#或者是行內配置
city: [beijing,tianjin,shanghai,chongqing]
#配置對象數據,一個 - 代表一個對象
person:
- name: tom
age: 18
addr: beijing
- name: lucy
age: 17
addr: shanghai
#或者是行內配置
person: [{name: tom,age: 18,addr: beijing},{name: lucy,age: 17,addr: shanghai}]
#配置Map集合
map:
key1: value1
key2: value2
配置文件值注入到組件中
@Value和@ConfigurationProperties為屬性注值區別
Feature | @ConfigurationProperties | @Value |
---|---|---|
Relaxed binding | yes | no |
Meta-data suport | yes | no |
SpEL evaluation | no | yes |
使用@Value注解從配置文件中獲取值
@Controller
public class GetParamWithYml {
@Value("${person.name}")//通過@Value注解來獲取yml配置文件中的值
String name;
@Value("${city.[0]}") //數組還是以數組下標來進行取值
String cityname;
@Value("${people.[0].age}")
int age;
@Value("${people.[0].name}") //獲取數組對象里面的值
String peoplename;
@Value("${hellomap.value2}") //獲取map對象的值
String v2;
@RequestMapping("/getinfo")
@ResponseBody
public String print() {
System.out.println(name);
System.out.println(age);
System.out.println(peoplename);
System.out.println(v2);
return name + cityname;
}
}
//yml配置文件中的配置
#普通對象的配置
person:
name: jason
age: 22
addr: chengdu
#普通字面量的配置
name: hellojason
#配置數組,集合等信息
city:
- beijing
- tinajing
- guangzhou
- xian
#配置對象數據
people:
- name: tom
age: 22
- name: lucy
age: 23
#配置map對象
hellomap:
value1: v1
value2: v2
/*
總結:使用@Value從yml配置文件中獲取值,比較精准的就可以獲取到值,但是當值較多的時候,書寫麻煩,比較累贅,而且當配置文件中層級很多的時候比較麻煩。所以@Value注解適合值較少的情況使用
*/
通過@ConfigurationProperties編寫配置類進行注入
/*
* person的配置類,從yml配置文件中獲取值
*/
@ConfigurationProperties(prefix = "person")
@Component//將這個配置類注冊為容器組件
public class PersonConf {
String name;
int age;
String addr;
setter/getter方法
}
//獲取配置文件的控制器
@RestController
public class PersonConfController {
@Autowired//將配置類自動注入進來
private PersonConf personConf;
@RequestMapping("/getconfInfo")
public String getInfo() {
String name = personConf.getName();
int age = personConf.getAge();
System.out.println(age);
return name;
}
}
/*
使用@ConfigurationProperties注解編寫配置類從yml配置文件中獲取值,優點如下:適合於需要獲取大量的配置信息,方便復用,其他控制器需要使用直接通過注入進去就可以使用了。他也可以自成一個組件。方便其他使用。
*/
/*
*@Value和@ConfigurationProperties從配置文件中獲取值,總結:
*@Value獲取值比較精准,適合於取值比較少的情況
*@ConfigruationProperties用於編寫配置類,通過組件注入的形式獲取配置文件中的值,適合於需要大量獲取配置文件中的值的情況,比較靈活,可以實現多復用。它是作為一個組件來使用的,通過@Auotware自動注入到控制器中
*/
配置文件的占位符
-
隨機數
//例如 ${random.value}、${random.int}、${random.long} ${random.int(10)}、${random.int[1024,65536]}
-
占位符獲取之前配置的值,如果沒有可以用:指定默認值
person.last‐name=張三${random.uuid}
person.age=${random.int}
person.birth=2017/12/15
person.boss=false
person.maps.k1=v1
person.maps.k2=14
person.lists=a,b,c
person.dog.name=${person.hello:hello}_dog
person.dog.age=15
多個Profile文件
我們在主配置文件編寫的時候,文件名可以是 application-{profile}.properties/yml
默認使用application.properties的配置;使用時可以激活想使用的那個配置文件,比較靈活
yml支持多文檔塊方式
server:
port: 8081
spring:
profiles:
active: prod
‐‐‐##使用-號表示多文檔塊
server:
port: 8083
spring:
profiles: dev
‐‐‐
server:
port: 8084
spring:
profiles: prod #指定屬於哪個環境
激活指定profile
1、在配置文件中指定 spring.profiles.active=dev
2、命令行:
java -jar spring-boot-02-config-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev;
可以直接在測試的時候,配置傳入命令行參數
3、虛擬機參數;
-Dspring.profiles.active=dev
配置文件的加載順序
springboot 啟動會掃描以下位置的application.properties或者application.yml文件作為Spring boot的默認配置文
件
–file:./config/
–file:./
–classpath:/config/
–classpath:/
優先級由高到底,高優先級的配置會覆蓋低優先級的配置;
SpringBoot會從這四個位置全部加載主配置文件;互補配置;所謂互補配置,就是說如果你的這配置文件中沒有配置 ,而在另一個配置文件配置了,那么將會綜合在一個然后生效。
可以通過spring.config.location來改變默認的配置文件位置
項目打包好以后,我們可以使用命令行參數的形式,啟動項目的時候來指定配置文件的新位置;指定配置文件和默認加載的這些配置文件共同起作用形成互補配置;例如:
java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --spring.config.location=G:/application.properties