本文翻譯自:http://docs.spring.io/spring-boot/docs/2.0.0.M2/reference/htmlsingle/
詳細(xì)介紹Spring boot的關(guān)鍵特征阔拳,針對(duì)有一定springboot基礎(chǔ)的同學(xué)。
目錄
- 1 外部配置
- 1.1 配置隨機(jī)值
- 1.2 訪問命令行屬性
- 1.3 應(yīng)用程式屬性檔案
- 1.4 配置文件特定的屬性
- 1.5 properties中的占位符
- 1.6 使用YAML而不是properties
- 1.6.1 加載YAML
- 1.6.2 將YAML作為Spring環(huán)境中的屬性
- 1.6.3 多個(gè)YAML文件
- 1.6.4 YAML的缺點(diǎn)
- 1.6.5 合并YAML列表
1. 外部配置
Spring Boot允許您外部化配置么伯,以便在不同的環(huán)境中使用相同的應(yīng)用程序代碼套才。您可以使用屬性文件椅野,YAML文件,環(huán)境變量和命令行參數(shù)來(lái)外部化配置∫媛ィ可以使用@Value注釋將屬性值直接注入到您的bean中假栓,通過(guò)Spring的Environment抽象訪問或通過(guò)@ConfigurationProperties綁定到結(jié)構(gòu)化對(duì)象寻行。
Spring Boot使用非常特殊的PropertySource命令,旨在允許明智地覆蓋值匾荆。屬性按以下順序考慮:
- Devtools全局設(shè)置屬性在您的主目錄(~/.spring-boot-devtools.properties當(dāng)devtools是活動(dòng)的)拌蜘。
- @TestPropertySource注釋在你的單元測(cè)試中。
- @SpringBootTest #properties 注解屬性在你的單元測(cè)試中牙丽。
- 命令行參數(shù)简卧。
- 來(lái)自SPRING_APPLICATION_JSON的屬性(嵌入在環(huán)境變量或系統(tǒng)屬性中的內(nèi)嵌JSON)
- *ServletConfig *init參數(shù)。
- *ServletContext *init參數(shù)烤芦。
- 來(lái)自java的JNDI屬性:java:comp/env举娩。
- Java系統(tǒng)屬性(System.getProperties())。
- OS環(huán)境變量。
- 一個(gè)RandomValuePropertySource铜涉,只有隨機(jī)的屬性智玻。
- 特定于應(yīng)用程序的應(yīng)用程序?qū)傩栽诖虬膉ar之外(application- {profile} .properties和YAML變量)。
- 封裝在jar中的配置文件特定的應(yīng)用程序?qū)傩裕?em>application- {profile} .properties和YAML變量)芙代。
- 您的打包的jar(application.properties和YAML變量)之外的應(yīng)用程序?qū)傩浴?/li>
- 應(yīng)用程序?qū)傩源虬谀愕膉ar中 (application.properties和YAML變量)吊奢。
- @PropertySource注釋在您的@Configuration類。
- 默認(rèn)屬性(使用SpringApplication.setDefaultProperties指定)纹烹。
要提供一個(gè)具體的例子页滚,假設(shè)你開發(fā)一個(gè)使用name屬性的@Component:
import org.springframework.stereotype.*
import org.springframework.beans.factory.annotation.*
@Component
public class MyBean {
@Value("${name}")
private String name;
// ...
}
在您的應(yīng)用程序類路徑(例如,您的jar中)中滔韵,您可以擁有一個(gè)application.properties逻谦,它為name提供了明智的默認(rèn)屬性值。在新的環(huán)境中運(yùn)行時(shí),可以在您的jar之外提供一個(gè)application.properties來(lái)覆蓋該name;對(duì)于一次性測(cè)試,您可以使用特定的命令行開關(guān)啟動(dòng)(例如脑溢,java -jar app.jar --name =“Spring”)。
注意:
SPRING_APPLICATION_JSON屬性可以在命令行中提供一個(gè)環(huán)境變量滋将。例如在UN * X shell中:
$ SPRING_APPLICATION_JSON ='{“foo”:{“bar”:“spam”}}'java -jar myapp.jar
在這個(gè)例子中,你將在springEnvironment中以foo.bar=spam結(jié)尾症昏。您還可以在系統(tǒng)變量中將JSON作為spring.application.json提供:
$ java -Dspring.application.json ='{“foo”:“bar”}'-jar myapp.jar
或命令行參數(shù):
$ java - jar myapp.jar --spring.application.json ='{“foo”:“bar”}'
或作為JNDI變量java:comp / env / spring.application.json随闽。
1.1 配置隨機(jī)值
RandomValuePropertySource可用于注入隨機(jī)值(例如,進(jìn)入秘密或測(cè)試用例)肝谭。它可以產(chǎn)生整數(shù)掘宪,長(zhǎng)整數(shù),uuid或字符串攘烛,例如:
my.secret=${random.value}
my.number=${random.int}
my.bignumber=${random.long}
my.uuid=${random.uuid}
my.number.less.than.ten=${random.int(10)}
my.number.in.range=${random.int[1024,65536]}
random.int* 語(yǔ)法是*OPEN value (,max) CLOSE
*魏滚,其中OPEN,CLOSE是任何字符和值坟漱,max是整數(shù)鼠次。如果提供max,則值為最小值芋齿,max為最大值(僅包含)腥寇。
1.2 訪問命令行屬性
默認(rèn)情況下,SpringApplication將任何命令行選項(xiàng)參數(shù)(以' - '開頭觅捆,例如--server.port = 9000)轉(zhuǎn)換為property赦役,并將其添加到Spring的Environment中。
如上所述栅炒,命令行屬性始終優(yōu)先于其他屬性源扩劝。如果不希望將命令行屬性添加到Environment中庸论,可以使用SpringApplication.setAddCommandLineProperties(false)禁用它們职辅。
1.3 應(yīng)用程式屬性檔案
SpringApplication將從以下位置的application.properties文件中加載屬性棒呛,并將它們添加到當(dāng)前目錄的Spring Environment:
- 一個(gè)/ config子目錄中。
- 當(dāng)前目錄
- 一個(gè) classpath /config 保中
- 類路徑根
列表按優(yōu)先級(jí)排序(在列表中定義的屬性中定義的屬性將覆蓋在較低位置中定義的位置)域携。
注意:您也可以使用YAML('.yml')文件替代“.properties”簇秒。
如果您不喜歡application.properties作為配置文件名,可以通過(guò)指定一個(gè)spring.config.name環(huán)境屬性來(lái)切換到另一個(gè)秀鞭。您還可以使用spring.config.location環(huán)境屬性(目錄位置的逗號(hào)分隔列表或文件路徑)引用顯式位置趋观。
$ java -jar myproject.jar --spring.config.name = myproject
或
$ java -jar myproject.jar --spring.config.location = classpath:/default.properties,classpath:/override.properties
注意:spring.config.name和spring.config.location非常早地用于確定哪些文件必須被加載,因此必須將其定義為環(huán)境屬性(通常是OS env锋边,system屬性或命令行參數(shù))皱坛。
如果spring.config.location包含目錄(而不是文件),它們應(yīng)該以/結(jié)束(并將在加載之前附加從spring.config.name生成的名稱豆巨,包括特定于文件的文件名)剩辟。在spring.config.location中指定的文件按原樣使用,沒有支持特定于配置文件的變量往扔,并且將被任何特定于配置文件的屬性覆蓋贩猎。
默認(rèn)的搜索路徑classpath:,classpath:/ config,file:,file:config /始終被使用,不管spring.config.location的值如何萍膛。 此搜索路徑從最低優(yōu)先級(jí)排序(file:config / 最高優(yōu)先級(jí))吭服。
如果您指定自己的位置,則它們優(yōu)先于所有默認(rèn)位置蝗罗,并使用相同的最低到最高優(yōu)先級(jí)排序艇棕。 這樣,您可以在application.properties(或使用spring.config.name選擇的其他基礎(chǔ)名稱)中為應(yīng)用程序設(shè)置默認(rèn)值串塑,并在運(yùn)行時(shí)使用不同的文件覆蓋它沼琉,并保留默認(rèn)值。
注意:如果使用環(huán)境變量而不是系統(tǒng)屬性拟赊,則大多數(shù)操作系統(tǒng)不允許使用周期分隔的鍵名稱刺桃,但可以使用下劃線(例如SPRING_CONFIG_NAME,而不是spring.config.name)吸祟。
注意:如果你在一個(gè)容器中運(yùn)行JNDI屬性(在java:comp / env)或者servlet 可以使用上下文初始化參數(shù)來(lái)代替環(huán)境變量或系統(tǒng)屬性瑟慈。
1.4 配置文件特定的屬性
除了application.properties文件之外,還可以使用命名約定application- {profile} .properties定義特定于配置文件的屬性屋匕。Environment具有默認(rèn)配置文件(默認(rèn)為[default])葛碧,如果沒有設(shè)置活動(dòng)配置文件(即,如果沒有顯式激活配置文件过吻,則加載了來(lái)自application-default.properties的屬性)进泼。
配置文件特定的屬性從與標(biāo)準(zhǔn)application.properties相同的位置加載蔗衡,配置文件特定的文件始終覆蓋非特定的文件,而不管特定于配置文件的文件是否在打包的jar內(nèi)部或外部乳绕。
如果指定了幾個(gè)配置文件绞惦,則應(yīng)用最后一個(gè)優(yōu)先策略。例如洋措,由spring.profiles.active屬性指定的配置文件通過(guò)SpringApplication API配置后添加济蝉,因此優(yōu)先。
注意:如果您在spring.config.location中指定了任何文件菠发,則不會(huì)考慮這些文件的特定于配置文件的變量王滤。使用 如果還要使用特定于配置文件的屬性,請(qǐng)?jiān)?em>spring.config.location中指定目錄滓鸠。
1.5 properties中的占位符
application.properties中的值通過(guò)使用現(xiàn)有Environment進(jìn)行過(guò)濾雁乡,以便您可以參考以前定義的值(例如,從系統(tǒng)屬性)糜俗。
app.name = MyApp
app.description = $ {app.name} is a Spring Boot application
您還可以使用此技術(shù)創(chuàng)建現(xiàn)有Spring Boot屬性的“簡(jiǎn)短”變體踱稍。
1.6 使用YAML而不是properties
YAML是JSON的超集,因此這是一種用于指定分層配置數(shù)據(jù)的非常方便的格式吩跋。只要您的類路徑中有SnakeYAML庫(kù)寞射,SpringApplication類將自動(dòng)支持YAML作為屬性的替代方法。
注意:如果您使用“Starters”锌钮,SnakeYAML將通過(guò)spring-boot-starter自動(dòng)提供桥温。
1.6.1 加載YAML
Spring Framework提供了兩個(gè)可用于加載YAML文檔的方便類。 YamlPropertiesFactoryBean將加載YAML作為Properties梁丘,并且YamlMapFactoryBean將加載YAML作為Map侵浸。例如,以下YAML文檔:
environments:
dev:
url: http://dev.bar.com
name: Developer Setup
prod:
url: http://foo.bar.com
name: My Cool App
將被轉(zhuǎn)換成這些屬性:
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
YAML列表表示為具有[index]取消引用的屬性鍵氛谜,例如YAML:
my:
servers:
- dev.bar.com
- foo.bar.com
將被轉(zhuǎn)換成這些屬性:
my.servers[0]=dev.bar.com
my.servers[1]=foo.bar.com
要使用Spring DataBinder實(shí)用程序(這是@ConfigurationProperties所做的)綁定到這樣的屬性掏觉,您需要在類型為java.util.List(或Set)的目標(biāo)bean中具有一個(gè)屬性,并且您需要提供一個(gè)setter值漫,或者用可變值初始化它澳腹,例如這將綁定到上面的屬性
@ConfigurationProperties(prefix="my")
public class Config {
private List<String> servers = new ArrayList<String>();
public List<String> getServers() {
return this.servers;
}
}
注意:
配置列表時(shí),需要特別小心杨何,因?yàn)楦采w方式將無(wú)法正常工作酱塔。在上面的例子中,當(dāng)我的幾個(gè)地方重新定義my.servers時(shí)危虱,單個(gè)元素的目標(biāo)是覆蓋羊娃,而不是列表。要確保具有較高優(yōu)先級(jí)的PropertySource可以覆蓋列表埃跷,您需要將其定義為單個(gè)屬性:
my:
servers: dev.bar.com,foo.bar.com
1.6.2 將YAML作為Spring環(huán)境中的屬性
可以使用YamlPropertySourceLoader類在SpringEnvironment中將YAML作為PropertySource進(jìn)行公開蕊玷。這允許您使用熟悉的@Value注釋和占位符語(yǔ)法來(lái)訪問YAML屬性邮利。
1.6.3 多個(gè)YAML文件
您可以使用spring.profiles鍵指定單個(gè)文件中的多個(gè)配置文件特定的YAML文檔,以指示文檔何時(shí)應(yīng)用垃帅。例如:
server:
address: 192.168.1.100
---
spring:
profiles: development
server:
address: 127.0.0.1
---
spring:
profiles: production
server:
address: 192.168.1.120
在上面的示例中延届,如果development配置文件處于活動(dòng)狀態(tài),則server.address屬性將為127.0.0.1挺智。如果development和production配置文件未啟用祷愉,則該屬性的值將為192.168.1.100。
如果應(yīng)用程序上下文啟動(dòng)時(shí)沒有顯式激活赦颇,默認(rèn)配置文件將被激活。所以在這個(gè)YAML中赴涵,我們?yōu)?em>security.user.password設(shè)置一個(gè)僅在“默認(rèn)”配置文件中可用的值:
server:
port: 8000
---
spring:
profiles: default
security:
user:
password: weak
而在此示例中媒怯,由于密碼未附加到任何配置文件,因此始終設(shè)置密碼髓窜,必要時(shí)必須在所有其他配置文件中顯式重置密碼:
server:
port: 8000
security:
user:
password: weak
使用“spring.profiles”元素指定的彈簧輪廓可以選擇使用扇苞!字符。如果為單個(gè)文檔指定了否定和非否定的配置文件寄纵,則至少有一個(gè)非否定配置文件必須匹配鳖敷,沒有否定配置文件可能匹配。
1.6.4 YAML的缺點(diǎn)
不能通過(guò)@PropertySource注釋來(lái)加載YAML文件程拭。因此定踱,在需要以這種方式加載值的情況下,需要使用屬性文件恃鞋。
1.6.5 合并YAML列表
如上所述崖媚,任何YAML內(nèi)容最終都轉(zhuǎn)化為屬性。當(dāng)通過(guò)配置文件覆蓋“列表”屬性時(shí)恤浪,該過(guò)程可能是直觀的畅哑。
例如,假設(shè)默認(rèn)情況下水由,name和description屬性為null的MyPojo對(duì)象荠呐。讓我們從FooProperties中公開MyPojo的列表:
@ConfigurationProperties("foo")
public class FooProperties {
private final List<MyPojo> list = new ArrayList<>();
public List<MyPojo> getList() {
return this.list;
}
}
請(qǐng)考慮以下配置:
foo:
list:
- name: my name
description: my description
---
spring:
profiles: dev
foo:
list:
- name: my another name
如果dev配置文件不活動(dòng),FooProperties.list將包含一個(gè)如上定義的MyPojo條目砂客。如果啟用了dev配置文件泥张,list仍將只包含一個(gè)條目(名稱為“我的另一個(gè)名稱”,描述為null)鞭盟。此配置不會(huì)將第二個(gè)MyPojo實(shí)例添加到列表中圾结,它不會(huì)合并項(xiàng)。
foo:
list:
- name: my name
description: my description
- name: another name
description: another description
---
spring:
profiles: dev
foo:
list:
- name: my another name
在上面的示例中齿诉,考慮到dev配置文件處于活動(dòng)狀態(tài)筝野,FooProperties.list將包含一個(gè)MyPojo實(shí)體(包含名稱為“my another 描述為null)晌姚。
當(dāng)在多個(gè)配置文件中指定集合時(shí),將使用具有最高優(yōu)先級(jí)的集合(并且僅使用該集合):