SpringBoot(3)—配置文件详解:Properties和YAML
一、配置文件優(yōu)先級(jí)加載機(jī)制
SpringBoot項(xiàng)目啟動(dòng)會(huì)掃描以下位置的application.properties或者application.yml作為默認(rèn)的配置文件
1、工程根目錄:./config/
2、工程根目錄:./
3、classpath:/config/
4、classpath:/
加載的優(yōu)先級(jí)順序是從上向下加載,并且所有的文件都會(huì)被加載,高優(yōu)先級(jí)的內(nèi)容會(huì)覆蓋低優(yōu)先級(jí)的內(nèi)容,形成互補(bǔ)配置
PS:不過(guò)需要注意的是在工程根路徑下或者根路徑的config下面的配置文件,在工程打包時(shí)候不會(huì)被打包進(jìn)去(這也可能和項(xiàng)目級(jí)別有關(guān)系,Module級(jí)別與IDEA中Project級(jí)別的,待驗(yàn)證,未實(shí)操)。
我們可以從ConfigFileApplicationListener這類(lèi)便可看出,其中DEFAULT_SEARCH_LOCATIONS屬性設(shè)置了加載的目錄:
private static final String DEFAULT_SEARCH_LOCATIONS = "classpath:/,classpath:/config/,file:./,file:./config/";
接著getSearchLocations方法中去逗號(hào)解析成Set,其中內(nèi)部類(lèi)Loader負(fù)責(zé)這一配置文件的加載過(guò)程,包括加載profile指定環(huán)境的配置,以application+’-’+name格式的拼接加載。
(1)我們也可以通過(guò)制定配置spring.config.location來(lái)改變默認(rèn)配置,一般在項(xiàng)目已經(jīng)打包后,我們可以通過(guò)以下指令來(lái)加載外部的配置
java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --spring.config.location=D:/application.properties
(2)另外也可以通過(guò)命令行參數(shù)進(jìn)行配置
(a)所有的配置都可以在命令行上進(jìn)行指定
(b)多個(gè)配置用空格分開(kāi);--配置項(xiàng)=值
java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --server.port=8087 --server.context-path=/abc
(3)以下優(yōu)先級(jí)從高到低加載順序:
(a)命令行參數(shù)
(b)來(lái)自java:comp/env的JNDI屬性
(c)Java系統(tǒng)屬性(System.getProperties())
(d)操作系統(tǒng)環(huán)境變量
(e)RandomValuePropertySource配置的random.*屬性值
(f)jar包外部的application-{profile}.properties或application.yml(帶spring.profile)配置文件
(g)jar包內(nèi)部的application-{profile}.properties或application.yml(帶spring.profile)配置文件
(h)jar包外部的application.properties或application.yml(不帶spring.profile)配置文件
(i)jar包內(nèi)部的application.properties或application.yml(不帶spring.profile)配置文件
備注:由jar包外想jar包內(nèi)進(jìn)行尋找,優(yōu)先加載帶profile的,再加載不帶profile的
(j)@Configuration注解類(lèi)上的@PropertySource
(k)通過(guò)SpringApplication.setDefaultProperties指定的默認(rèn)屬性
二、properties配置優(yōu)先級(jí)>YAML配置優(yōu)先級(jí)
SpringBoot使用一個(gè)以application命名的配置文件作為默認(rèn)的全局配置文件。支持properties后綴結(jié)尾的配置文件或者以yml/yaml后綴結(jié)尾的YAML的文件配置。
以設(shè)置應(yīng)用端口為例
properties文件示例(application.properties):
server.port=80
YAML文件示例(application.yml):
server: port: 80
備注:在同一目錄下,properties配置優(yōu)先級(jí) > YAML配置優(yōu)先級(jí)。//所以我們?cè)趈ar包啟動(dòng)時(shí)帶上properties寫(xiě)法的配置可以覆蓋配置。
yml類(lèi)型的寫(xiě)法:冒號(hào)后要加個(gè)空格
三、@PropertySource和@ImportResource
通常情況下我們將配置配置在application開(kāi)頭的主配置文件中,這樣隨著項(xiàng)目的增大配置項(xiàng)的增多會(huì)使文件變得非常臃腫,其實(shí)SpringBoot早已考慮到了該問(wèn)題,SpringBoot提供了**@PropertySource和@ImportResource**兩個(gè)注解用于加載外部配置文件使用。
@PropertySource通常用于屬性加載配置文件,注意@PropertySource注解不支持加載yaml文件,支持properties文件。
@ImportResource通常用于加載Spring的xml配置文件
1、@propertySource使用
(1)裝配properties配置文件
在sources/config下創(chuàng)建一個(gè)yaml文件命名為user.properties內(nèi)容與上方user的配置一樣
@PropertySource(value = {"classpath:config/user.properties"})
@Component
@ConfigurationProperties(prefix = "user")
public class Login{
private String username;
private String password;
...
}
(2)同時(shí)加載多個(gè)配置問(wèn)題
細(xì)心的你,會(huì)發(fā)現(xiàn)@PropertySource注解中屬性value為一個(gè)數(shù)組,如果同時(shí)加載多個(gè)配置文件,并且不同配置文件中對(duì)同一個(gè)屬性設(shè)置了不同的值,那么Spring會(huì)識(shí)別哪一個(gè)呢?
帶著疑問(wèn),我們可以通過(guò)控制變量法進(jìn)行測(cè)試,具體過(guò)程再在贅述。
@PropertySource(value = {"classpath:config/user1.properties","classpath:config/user2.properties"})
結(jié)論:Spring加載順序?yàn)閺淖蟮接翼樞蚣虞d,后加載的會(huì)覆蓋先加載的屬性值。
(3)配yaml配置文件
如果你有強(qiáng)迫癥,一定想加載yaml配置文件,那么可以通過(guò)PropertySourcesPlaceholderConfigurer類(lèi)來(lái)加載yaml文件,將原來(lái)的user.properties改成user.yaml,Bean配置類(lèi)中加入如下代碼,Login配置類(lèi)和一開(kāi)始的方式一致。
@Bean
public static PropertySourcesPlaceholderConfigurer loadProperties() {
PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();
YamlPropertiesFactoryBean yaml = new YamlPropertiesFactoryBean();
//yaml.setResources(new FileSystemResource("classpath:config/user.yml"));//File路徑引入
yaml.setResources(new ClassPathResource("config/user.yml"));//class路徑引入
configurer.setProperties(yaml.getObject());
return configurer;
}
運(yùn)行一下,仍然可以能達(dá)到加載配置效果的。
2、@ImportResource使用
SpringBoot提出零xml的配置,因此SpringBoot默認(rèn)情況下是不會(huì)主動(dòng)識(shí)別項(xiàng)目中Spring的xml配置文件。為了能夠加載xml的配置文件,SpringBoot提供了@ImportResource注解該注解可以加載Spring的xml配置文件,通常加于啟動(dòng)類(lèi)上。
@ImportResource(value = {"classpath:/beans.xml"})
@SpringBootApplication(scanBasePackages = {"team.seagull.client"})
public class DeployApplication {
public static void main(String[] args) {
SpringApplication.run(DeployApplication.class, args);
}
}
四、多環(huán)境配置
1、多環(huán)境配置的好處
(1)不同環(huán)境配置可以配置不同的參數(shù)
(2)便于部署,提高效率,減少出錯(cuò)
2、properties多環(huán)境配置
(1)配置激活選項(xiàng)
spring.profiles.active=dev
(2)添加其他配置文件
3、YAML多環(huán)境配置
(1)配置激活選項(xiàng)
spring:
profiles:
active: dev
(2)在配置文件添加三個(gè)英文狀態(tài)下的短橫線即可區(qū)分
---
spring:
profiles: dev
4、兩種配置方式的比較
(1)Properties配置多環(huán)境,需要添加多個(gè)配置文件,YAML只需要一個(gè)配件文件
(2)書(shū)寫(xiě)格式的差異,yaml相對(duì)比較簡(jiǎn)潔,優(yōu)雅
(3)YAML的缺點(diǎn):不能通過(guò)@PropertySource注解加載。如果需要使用@PropertySource注解的方式加載值,那就要使用properties文件。
5、如何使用
java -jar myapp.jar --spring.profiles.active=dev
五、一般配置文件方案參考
我在自己的springboot項(xiàng)目中使用了多個(gè)配置文件,
application.properties是主配置文件,放一些項(xiàng)目通用的配置;
application-dev.properties 放的是平常開(kāi)發(fā)的一些配置,比如說(shuō)數(shù)據(jù)庫(kù)的連接地址、帳號(hào)密碼等;
application-prod.properties 放的是生產(chǎn)環(huán)境的一些配置,比如說(shuō)數(shù)據(jù)庫(kù)的連接地址、帳號(hào)密碼等。
當(dāng)然也可以再多一個(gè)application-test.properties ,放一些測(cè)試環(huán)境需要用到的參數(shù)。
可以通過(guò)在application.properties 中設(shè)置spring.profiles.active=prod或者dev來(lái)使用application-dev.properties或者application-prod.properties文件,當(dāng)然test文件也是同理。
總結(jié)
以上是生活随笔為你收集整理的SpringBoot(3)—配置文件详解:Properties和YAML的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 网上银行安全吗(中国邮政储蓄网上银行登录
- 下一篇: 方框内打钩符号(Word中怎么在方框中打