一络它、SpringBoot的yml配置文件
二柄延、SpringBoot配置文件優(yōu)先級(jí)
三檬贰、Profile-specific配置文件
SpringBoot版本:1.5.13.RELEASE
對(duì)應(yīng)官方文檔鏈接:https://docs.spring.io/spring-boot/docs/1.5.13.RELEASE/reference/htmlsingle/
上一篇:SpringBoot 入門篇(四) SpringBoot外部配置以及優(yōu)先級(jí)
一徒欣、SpringBoot的yml配置文件
??SpringBoot的配置文件常用的有2種類型炼杖,.properties和.yml。默認(rèn)情況下景用,SpringBoot會(huì)加載classpath或者classpath:/config下的application.properties或者application.yml文件涵叮。
??.properties文件是我們常用的配置文件,.yml則是YAML文件,YAML是一種易閱讀割粮、易和腳本語言交互的用來表達(dá)資料序列的編程語言盾碗,這里簡(jiǎn)單說下語法
??(1)使用空格 Space 縮進(jìn)分層,同層元素左對(duì)齊舀瓢,不同層元素使用不同的空格數(shù)目縮進(jìn)(不能使用 Tab置尔,各系統(tǒng) Tab對(duì)應(yīng)的空格數(shù)目可能不同,導(dǎo)致層次混亂)氢伟;
??(2)#表示注釋榜轿;
??(3)破折號(hào)后面跟一個(gè)空格表示列表;
??(4)key和value之間用冒號(hào)和空格分隔朵锣。
environments:
dev:
url: http://dev.bar.com
name: Developer Setup
prod:
url: http://foo.bar.com
name: My Cool App
#yaml 的list集合
my:
servers:
- dev.bar.com
- foo.bar.com
??上述代碼段是一個(gè)標(biāo)準(zhǔn)的yml文件內(nèi)容谬盐,等價(jià)于如下properties配置
environments.dev.url=http://dev.bar.com
environments.dev.name=Developer Setup
environments.prod.url=http://foo.bar.com
environments.prod.name=My Cool App
my.servers[0]=dev.bar.com
my.servers[1]=foo.bar.com
??SpringBoot通過YamlPropertiesFactoryBean 來加載application.yml文件,并通過YamlMapFactoryBean 將其轉(zhuǎn)換成Map诚些。
??我們可以通過@Value或者@ConfigurationProperties注解來獲取配置文件中的數(shù)據(jù)飞傀。例如有如下application.yml文件:
name:
nameStr
age:
11
#yaml 的list集合
my:
servers:
- dev.bar.com
- foo.bar.com
@Configuration
public class MyConfiguration {
// 通過@Value獲取值
@Value("${name}")
private String name;
@Value("${age}")
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
@Configuration
//通過@ConfigurationProperties獲取值
@ConfigurationProperties(prefix="my")
public class MyConfig {
private List<String> servers = new ArrayList<String>();
public List<String> getServers() {
return this.servers;
}
}
@SpringBootApplication
@RestController
public class Application {
public static void main(String[] args) {
SpringApplication application = new SpringApplication(Application.class);
application.run(args);
}
@Autowired
private MyConfiguration myConfiguration;
@RequestMapping("/getMyConfiguration")
public String getMyConfiguration() {
return myConfiguration.getName() + ":" + myConfiguration.getAge();
}
@Autowired
private MyConfig myConfig;
@RequestMapping("/getMyConfig")
public List<String> getMyConfig() {
return myConfig.getServers();
}
}
??啟動(dòng)Application,在瀏覽器分別輸入 http://localhost:8080/getMyConfiguration 和 http://localhost:8080/getMyConfig 可以得到配置的值诬烹。
??當(dāng)使用@ConfigurationProperties獲取配置值砸烦,SpringBoot還提供了一種寬松的綁定方式(@Value不支持該特性):
@ConfigurationProperties(prefix="person")
public class OwnerProperties {
private String firstName;
public String getFirstName() {
return this.firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
}
則在配置文件中使用如下任意一種方式都能獲取對(duì)應(yīng)的配置值
person.firstName
person.first-name
person.first_name
PERSON_FIRST_NAME
二、SpringBoot配置文件優(yōu)先級(jí)
??默認(rèn)情況下绞吁,SpringBoot會(huì)加載如下位置的配置文件幢痘,這些文件可以同時(shí)存在,當(dāng)這些文件中的多個(gè)存在相同的key時(shí)家破,value的優(yōu)先級(jí)從高到低分別為:
??(1)當(dāng)前應(yīng)用目錄下/config子文件夾下的application.properties或者application.yml文件颜说;
??(2)當(dāng)前應(yīng)用目錄下的application.properties或者application.yml文件;
??(3)類路徑下/config子文件夾下的application.properties或者application.yml文件汰聋;
??(4)類路徑下的application.properties或者application.yml文件门粪。
??如果想指定加載的配置文件,則可以通過在啟動(dòng)時(shí)添加命令行參數(shù)--spring.config.name或者--spring.config.location進(jìn)行指定文件烹困。
$ java -jar app.jar --spring.config.name=myproject
或者
$ java -jar myproject.jar --spring.config.location=classpath:/default.properties,classpath:/override.properties
??需要注意的是玄妈,使用命令行參數(shù)指定的文件的優(yōu)先級(jí)是最高的,例如如果通過命令行指定了應(yīng)用目錄下./custom-config/和classpath:/custom-config/髓梅,則value的優(yōu)先級(jí)從高到低分別為:
??(3)當(dāng)前應(yīng)用目錄下./custom-config路徑下的application.properties或者application.yml文件拟蜻;
??(4)類路徑下子文件夾/custom-config/下的application.properties或者application.yml文件;
??(3)當(dāng)前應(yīng)用目錄下/config子文件夾下的application.properties或者application.yml文件女淑;
??(4)當(dāng)前應(yīng)用目錄下的application.properties或者application.yml文件瞭郑;
??(5)類路徑下/config子文件夾下的application.properties或者application.yml文件;
??(6)類路徑下的application.properties或者application.yml文件鸭你。
三、Profile-specific配置文件
??SpringBoot除了會(huì)加載application.properties/yml外,還會(huì)加載application-{profile}.properties/yml袱巨,其中{profile}默認(rèn)為default阁谆,也就是說,如果同時(shí)存在application.properties/yml和application-default.properties/yml愉老,SpringBoot會(huì)同時(shí)加載它們场绿,且application-default.properties/yml的優(yōu)先級(jí)更高。
??我們也可以自定義{profile}嫉入,需要注意焰盗,除了application-default.properties/yml外,application-{profile}.properties/yml文件在加載后會(huì)處于未激活狀態(tài)咒林,即其中的值無法使用熬拒,如果想使用,則需要在application.properties/yml中指定spring.profiles.active垫竞。
??例如澎粟,在工程中有如下3個(gè)文件,application-dev.yml表示開發(fā)使用的配置欢瞪,application-test.yml表示測(cè)試使用的配置活烙,application-pro.yml表示生產(chǎn)環(huán)境使用的配置,則我們通過在application.yml中指定spring.profiles.active的值為{profile}對(duì)應(yīng)的值(即dev\test\pro)遣鼓,就可以靈活的修改對(duì)應(yīng)配置啸盏,方便開發(fā)、測(cè)試和運(yùn)維的同學(xué)使用不同的配置骑祟。
spring:
profiles:
active:
pro
??另外一種激活application-{profile}.properties/yml文件的方式是使用SpringApplication.setAdditionalProfiles()方法:
public static void main(String[] args) {
SpringApplication application = new SpringApplication(Application.class);
application.setAdditionalProfiles("dev");
application.run(args);
}