加載 property 順序
公司主營(yíng)業(yè)務(wù):成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、移動(dòng)網(wǎng)站開(kāi)發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。成都創(chuàng)新互聯(lián)公司是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開(kāi)放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來(lái)的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來(lái)驚喜。成都創(chuàng)新互聯(lián)公司推出海豐免費(fèi)做網(wǎng)站回饋大家。隨機(jī)屬性
命令行屬性
Application 屬性文件
Profile 特定屬性
屬性中的占位符
YAML 屬性
訪問(wèn)屬性
多 profile 配置
YAML 的缺點(diǎn)
屬性前綴
屬性松散綁定規(guī)則
屬性轉(zhuǎn)換
時(shí)間單位轉(zhuǎn)換
數(shù)據(jù)大小轉(zhuǎn)換
校驗(yàn)屬性
Spring Boot 加載 property 順序如下:
Devtools 全局配置?(當(dāng) devtools 被激活?\~/.spring-boot-devtools.properties
).
="https://docs.spring.io/spring/docs/5.1.3.RELEASE/javadoc-api/org/springframework/test/context/TestPropertySource.html">測(cè)試環(huán)境中的 @TestPropertySource 注解配置
測(cè)試環(huán)境中的屬性?properties
:@SpringBootTest
?和?測(cè)試注解.
命令行參數(shù)
SPRING_APPLICATION_JSON
?屬性
ServletConfig
?初始化參數(shù)
ServletContext
?初始化參數(shù)
JNDI attributes from 通過(guò)?java:comp/env
?配置的 JNDI 屬性
Java 系統(tǒng)屬性 (System.getProperties()
)
操作系統(tǒng)環(huán)境比那里
RandomValuePropertySource
?加載?random.*
?形式的屬性
jar 包外的?application-{profile}.properties
?或?application-{profile}.yml
?配置
jar 包內(nèi)的?application-{profile}.properties
?或?application-{profile}.yml
?配置
jar 包外的?application.properties
?或?application.yml
?配置
jar 包內(nèi)的?application.properties
?或?application.yml
?配置
@PropertySource
?綁定的配置
默認(rèn)屬性 (通過(guò)?SpringApplication.setDefaultProperties
?指定)
RandomValuePropertySource
?類(lèi)用于配置隨機(jī)值。
示例:
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]}
默認(rèn)情況下,?SpringApplication
?會(huì)獲取?--
?參數(shù)(例如?--server.port=9000
?),并將這個(gè)?property
?添加到 Spring 的?Environment
?中。
如果不想加載命令行屬性,可以通過(guò)?SpringApplication.setAddCommandLineProperties(false)
禁用。
SpringApplication
?會(huì)自動(dòng)加載以下路徑下的?application.properties
?配置文件,將其中的屬性讀到 Spring 的?Environment
?中。
當(dāng)前目錄的?/config
?子目錄
當(dāng)前目錄
classpath 路徑下的?/config
?package
classpath 根路徑
注:
以上列表的配置文件會(huì)根據(jù)順序,后序的配置會(huì)覆蓋前序的配置。
你可以選擇?YAML(yml)?配置文件替換 properties 配置文件。
如果不喜歡?application.properties
?作為配置文件名,可以使用?spring.config.name
?環(huán)境變量替換:
$?java?-jar?myproject.jar?--spring.config.name=myproject
可以使用?spring.config.location
?環(huán)境變量指定配置文件路徑:
$?java?-jar?myproject.jar?--spring.config.location=classpath:/default.properties,classpath:/override.properties
如果定義?application-{profile}.properties
?形式的配置文件,將被視為?profile
?環(huán)境下的特定配置。
可以通過(guò)?spring.profiles.active
?參數(shù)來(lái)激活 profile,如果沒(méi)有激活的 profile,默認(rèn)會(huì)加載?application-default.properties
?中的配置。
application.properties
?中的值會(huì)被?Environment
?過(guò)濾,所以,可以引用之前定義的屬性。
app.name=MyApp app.description=${app.name}?is?a?Spring?Boot?application
注:你可以使用此技術(shù)來(lái)創(chuàng)建 Spring Boot 屬性變量。請(qǐng)參考:?Section 77.4, “Use ‘Short’ Command Line Arguments
Spring Framework provides two convenient classes that can be used to load YAML documents. The?YamlPropertiesFactoryBean
?loads YAML as?Properties
?and the?YamlMapFactoryBean
?loads YAML as a?Map
.
Spring 框架有兩個(gè)類(lèi)支持加載 YAML 文件。
YamlPropertiesFactoryBean
?將 YAML 文件的配置加載為?Properties
?。
YamlMapFactoryBean
?將 YAML 文件的配置加載為?Map
?。
示例 1
environments: dev: url:?http://dev.example.com name:?Developer?Setup prod: url:?http://another.example.com name:?My?Cool?App
等價(jià)于:
environments.dev.url=http://dev.example.com environments.dev.name=Developer?Setup environments.prod.url=http://another.example.com environments.prod.name=My?Cool?App
YAML 支持列表形式,等價(jià)于 property 中的?[index]
?:
my: servers: -?dev.example.com -?another.example.com
等價(jià)于
my.servers[0]=dev.example.com my.servers[1]=another.example.com
YamlPropertySourceLoader
?類(lèi)會(huì)將 YAML 配置轉(zhuǎn)化為 Spring?Environment
?類(lèi)中的?PropertySource
?。然后,你可以如同 properties 文件中的屬性一樣,使用?@Value
?注解來(lái)訪問(wèn) YAML 中配置的屬性。
server: ??address:?192.168.1.100 --- spring: ??profiles:?development server: ??address:?127.0.0.1 --- spring: ??profiles:?production?&?eu-central server: ??address:?192.168.1.120
注:YAML 注解中的屬性不能通過(guò)?@PropertySource
?注解來(lái)訪問(wèn)。所以,如果你的項(xiàng)目中使用了一些自定義屬性文件,建議不要用 YAML。
package?com.example; import?java.net.InetAddress; import?java.util.ArrayList; import?java.util.Collections; import?java.util.List; import?org.springframework.boot.context.properties.ConfigurationProperties; @ConfigurationProperties(prefix="acme") public?class?AcmeProperties?{ private?boolean?enabled; private?InetAddress?remoteAddress; private?final?Security?security?=?new?Security(); public?boolean?isEnabled()?{?...?} public?void?setEnabled(boolean?enabled)?{?...?} public?InetAddress?getRemoteAddress()?{?...?} public?void?setRemoteAddress(InetAddress?remoteAddress)?{?...?} public?Security?getSecurity()?{?...?} public?static?class?Security?{ private?String?username; private?String?password; private?List?roles?=?new?ArrayList<>(Collections.singleton("USER")); public?String?getUsername()?{?...?} public?void?setUsername(String?username)?{?...?} public?String?getPassword()?{?...?} public?void?setPassword(String?password)?{?...?} public?List ?getRoles()?{?...?} public?void?setRoles(List ?roles)?{?...?} } }
相當(dāng)于支持配置以下屬性:
acme.enabled
acme.remote-address
acme.security.username
acme.security.password
acme.security.roles
然后,你需要使用?@EnableConfigurationProperties
?注解將屬性類(lèi)注入配置類(lèi)中。
@Configuration @EnableConfigurationProperties(AcmeProperties.class) public?class?MyConfiguration?{ }
Spring Boot 屬性名綁定比較松散。
以下屬性 key 都是等價(jià)的:
PropertyNoteacme.my-project.person.first-name-
分隔acme.myProject.person.firstName
駝峰命名acme.my_project.person.first_name_
分隔ACME_MYPROJECT_PERSON_FIRSTNAME
大寫(xiě)字母
如果需要類(lèi)型轉(zhuǎn)換,你可以提供一個(gè)?ConversionService
?bean (一個(gè)名叫?conversionService
的 bean) 或自定義屬性配置 (一個(gè)?CustomEditorConfigurer
?bean) 或自定義的?Converters
?(被?@ConfigurationPropertiesBinding
?注解修飾的 bena)。
Spring 使用?java.time.Duration
?類(lèi)代表時(shí)間大小,以下場(chǎng)景適用:
除非指定?@DurationUnit
?,否則一個(gè) long 代表的時(shí)間為毫秒。
ISO-8601 標(biāo)準(zhǔn)格式(?java.time.Duration
?的實(shí)現(xiàn)就是參照此標(biāo)準(zhǔn))
你也可以使用以下支持的單位:
ns
?- 納秒
us
?- 微秒
ms
?- 毫秒
s
?- 秒
m
?- 分
h
?- 時(shí)
d
?- 天
示例:
@ConfigurationProperties("app.system") public?class?AppSystemProperties?{ @DurationUnit(ChronoUnit.SECONDS) private?Duration?sessionTimeout?=?Duration.ofSeconds(30); private?Duration?readTimeout?=?Duration.ofMillis(1000); public?Duration?getSessionTimeout()?{ return?this.sessionTimeout; } public?void?setSessionTimeout(Duration?sessionTimeout)?{ this.sessionTimeout?=?sessionTimeout; } public?Duration?getReadTimeout()?{ return?this.readTimeout; } public?void?setReadTimeout(Duration?readTimeout)?{ this.readTimeout?=?readTimeout; } }
Spring 使用?DataSize
?類(lèi)代表數(shù)據(jù)大小,以下場(chǎng)景適用:
long 值(默認(rèn)視為 byte)
你也可以使用以下支持的單位:
B
KB
MB
GB
TB
示例:
@ConfigurationProperties("app.io") public?class?AppIoProperties?{ @DataSizeUnit(DataUnit.MEGABYTES) private?DataSize?bufferSize?=?DataSize.ofMegabytes(2); private?DataSize?sizeThreshold?=?DataSize.ofBytes(512); public?DataSize?getBufferSize()?{ return?this.bufferSize; } public?void?setBufferSize(DataSize?bufferSize)?{ this.bufferSize?=?bufferSize; } public?DataSize?getSizeThreshold()?{ return?this.sizeThreshold; } public?void?setSizeThreshold(DataSize?sizeThreshold)?{ this.sizeThreshold?=?sizeThreshold; } }
@ConfigurationProperties(prefix="acme") @Validated public?class?AcmeProperties?{ @NotNull private?InetAddress?remoteAddress; @Valid private?final?Security?security?=?new?Security(); //?...?getters?and?setters public?static?class?Security?{ @NotEmpty public?String?username; //?...?getters?and?setters } }
你也可以自定義一個(gè)名為?configurationPropertiesValidator
?的校驗(yàn)器 Bean。獲取這個(gè)?@Bean
?的方法必須聲明為?static
。
使用方法:
mvn?clean?package cd?target java?-jar?sbe-core-property.jar
本人免費(fèi)整理了Java高級(jí)資料,涵蓋了Java、Redis、MongoDB、MySQL、Zookeeper、Spring Cloud、Dubbo高并發(fā)分布式等教程,一共30G,需要自己領(lǐng)取。
傳送門(mén):https://mp.weixin.qq.com/s/JzddfH-7yNudmkjT0IRL8Q
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。