SpringBoot配置加載,各配置文件優(yōu)先級對比方式
1.SpringBoot配置文件
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
yaml語法規(guī)范這里不多說
兩者同時(shí)存在情況
假如各配置文件都配置了不同的端口,那么SpringBoot會使用哪一個(gè)端口呢?帶著疑問試驗(yàn)一下實(shí)例
- 在resources目錄下創(chuàng)建兩個(gè)配置文件,一個(gè)為application.yml配置文件,設(shè)置端口為8010,另一個(gè)為application.properties配置文件,設(shè)置端口為8020;
- 重啟系統(tǒng);
- 運(yùn)行結(jié)果:

- 結(jié)論:可見在同一目錄下,properties配置優(yōu)先級 > YAML配置優(yōu)先級。//所以我們在jar包啟動(dòng)時(shí)帶上properties寫法的配置可以覆蓋配置
2.配置文件目錄
SpringBoot配置文件可以放置在多種路徑下,不同路徑下的配置優(yōu)先級有所不同??煞胖媚夸?優(yōu)先級從高到低)
- file:./config/ (當(dāng)前項(xiàng)目路徑config目錄下);
- file:./ (當(dāng)前項(xiàng)目路徑下);
- classpath:/config/ (類路徑config目錄下);
- classpath:/ (類路徑config下).
優(yōu)先級由高到底,高優(yōu)先級的配置會覆蓋低優(yōu)先級的配置;
SpringBoot會從這四個(gè)位置全部加載配置文件并互補(bǔ)配置;
我們可以從ConfigFileApplicationListener這類便可看出,其中DEFAULT_SEARCH_LOCATIONS屬性設(shè)置了加載的目錄:
private static final String DEFAULT_SEARCH_LOCATIONS = "classpath:/,classpath:/config/,file:./,file:./config/";
接著getSearchLocations方法中去逗號解析成Set,其中內(nèi)部類Loader負(fù)責(zé)這一配置文件的加載過程,包括加載profile指定環(huán)境的配置,以application+'-'+name格式的拼接加載。
多種目錄配置同時(shí)存在情況
接下來還是以端口配置為例
- 在resources/目錄下配置文件設(shè)置端口為8888;
- 在resources/config目錄下配置文件設(shè)置端口為9999;
- 在項(xiàng)目路徑下配置文件設(shè)置端口為6666;
- 在項(xiàng)目路徑config目錄下配置文件設(shè)置端口為7777;

最終運(yùn)行結(jié)果:
Tomcat started on port(s): 7777 (http) with context path '/beedo'
Started BeedoApplication in 4.544 seconds (JVM running for 5.335)
通過控制變量法得以論證
其優(yōu)先級由高到底,高優(yōu)先級的配置會覆蓋低優(yōu)先級的配置
3.自定義配置屬性
SpringBoot提供了許多的配置,但通常情況我們需要自定義自己的配置應(yīng)用自己的系統(tǒng)中,如你需要配置一個(gè)默認(rèn)的用戶名密碼做為系統(tǒng)的登錄用。
首先創(chuàng)建一個(gè)實(shí)體類,作為配置注入用,并使用**@ConfigurationProperties注解進(jìn)行批量注入, 也可以使用Spring底層注解
@Value("${user.username}")**的方式一個(gè)一個(gè)注入達(dá)到同意的效果
@Component
@ConfigurationProperties(prefix = "user")
public class Login{
private String username;
private String password;
...
}
或者@Value寫法
@Component
public class Login{
private String username;
private String password;
...
}
配置yaml文件
user:
username: admin
password: 123
或者properties文件
login.username=admin login.password=123
編寫一個(gè)junit測試用例,看看配置的值是否正常注入:
@RunWith(SpringRunner.class)
@SpringBootTest
public class DeployApplicationTests {
@Autowired
private Login login;
@Test
public void contextLoads() {
System.out.println(login);
}
}
從輸出結(jié)果上看,值已正常注入
Login{username=‘a(chǎn)dmin', password=‘123'}
| 比較項(xiàng) | @ConfigurationProperties | @Value |
|---|---|---|
| 全量注入 | 支持 | 否 |
| 松散綁定(Relaxed binding) | 支持 | 否 |
| SpEL | 否 | 支持 |
| JSR303 | 支持 | 不支持 |
**松散綁定:**駝峰命名(userName)、橫干拼接(user-name)、下劃線(user_name)之間可以互相識別綁定稱為做松散綁定 **JSR303:**通過@Email,@Nullable,@Digits 等等注解進(jìn)行郵箱、判空、數(shù)字格式等等數(shù)據(jù)的校驗(yàn),更多相關(guān)內(nèi)容請參考IBM的中文文檔:https://www.ibm.com/developerworks/cn/java/j-lo-jsr303/index.html @ConfigurationProperties通常用于將配置全量注入某個(gè)類中; @Value通常用于注入某一些特定配置值中;
自定義配置提示
在編寫配置時(shí),你會發(fā)現(xiàn)自定義配置沒有提示,讓你在使用自定義配置時(shí)變的很麻煩,其實(shí)SpringBoot早已為我們準(zhǔn)備好了提示的需要,只需要用引入相關(guān)依賴即可有提示。
在沒有加入依賴時(shí)idea會有如下提示:

添加依賴,該idea提示便消失,編寫自定義配置時(shí)也有相應(yīng)提示:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
需要運(yùn)行一下
4.指定配置文件
通常情況下我們將配置配置在application開頭的主配置文件中,這樣隨著項(xiàng)目的增大配置項(xiàng)的增多會使文件變得非常臃腫,其實(shí)SpringBoot早已考慮到了該問題,SpringBoot提供了**@PropertySource和@ImportResource**兩個(gè)注解用于加載外部配置文件使用。
- @PropertySource通常用于屬性加載配置文件,注意@PropertySource注解不支持加載yaml文件,支持properties文件。
- @ImportResource通常用于加載Spring的xml配置文件
@PropertySource使用
裝配properties配置文件
在sources/config下創(chuàng)建一個(gè)yaml文件命名為user.properties內(nèi)容與上方user的配置一樣

Login類可如下寫法
@PropertySource(value = {"classpath:config/user.properties"})
@Component
@ConfigurationProperties(prefix = "user")
public class Login{
private String username;
private String password;
...
}
運(yùn)行一下,同樣能達(dá)到加載配置效果
同時(shí)加載多個(gè)配置問題
細(xì)心的你,會發(fā)現(xiàn)@PropertySource注解中屬性value為一個(gè)數(shù)組,如果同時(shí)加載多個(gè)配置文件,并且不同配置文件中對同一個(gè)屬性設(shè)置了不同的值,那么Spring會識別哪一個(gè)呢?
帶著疑問,我們可以通過控制變量法進(jìn)行測試,具體過程再在贅述。
@PropertySource(value = {"classpath:config/user1.properties","classpath:config/user2.properties"})
結(jié)論:Spring加載順序?yàn)閺淖蟮接翼樞蚣虞d,后加載的會覆蓋先加載的屬性值。
裝配yaml配置文件
如果你有強(qiáng)迫癥,一定想加載yaml配置文件,那么可以通過PropertySourcesPlaceholderConfigurer類來加載yaml文件,將原來的user.properties改成user.yaml,Bean配置類中加入如下代碼,Login配置類和一開始的方式一致。
@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á)到加載配置效果的
@ImportResource使用
SpringBoot提出零xml的配置,因此SpringBoot默認(rèn)情況下時(shí)不會識別項(xiàng)目中Spring的xml配置文件。為了能夠加載xml的配置文件,SpringBoot提供了@ImportResource注解該注解可以加載Spring的xml配置文件,通常加于啟動(dòng)類上。
@ImportResource(value = {"classpath:/beans.xml"})
@SpringBootApplication(scanBasePackages = {"team.seagull.client"})
public class DeployApplication {
public static void main(String[] args) {
SpringApplication.run(DeployApplication.class, args);
}
}
其他問題
idea使用*.properties文件出現(xiàn)中文亂碼問題?
idea對*.properties默認(rèn)編碼為GBK,通常我們項(xiàng)目為UTF-8編碼,這樣程序在讀取時(shí)就會出現(xiàn)亂碼問題;
解決方法:
idea 中 打開如下選項(xiàng)File->Sttings->Editor->FileEncodings

將GBK修改為UTF-8并勾選
Transparent native-to ascill conversion(在運(yùn)行的時(shí)候轉(zhuǎn)換成ascii碼)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java接口的回調(diào)機(jī)制的實(shí)現(xiàn)
本文主要介紹了Java中回調(diào)機(jī)制的實(shí)現(xiàn)方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-01-01
Java實(shí)戰(zhàn)之制作在線音樂網(wǎng)站
這篇文章主要介紹了如何通過Java實(shí)現(xiàn)一個(gè)精美風(fēng)的在線音樂網(wǎng)站,文章采用到了JSP、JQuery、Ajax等技術(shù),感興趣的小伙伴可以了解一下2022-02-02
在springboot中使用注解將值注入?yún)?shù)的操作
這篇文章主要介紹了在springboot中使用注解將值注入?yún)?shù)的操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-04-04
RestTemplate報(bào)錯(cuò)I/O?error?on?POST?request?for的解決辦法
這篇文章主要給大家介紹了關(guān)于RestTemplate報(bào)錯(cuò)I/O?error?on?POST?request?for的解決辦法,文中通過代碼實(shí)例將解決的辦法介紹的非常詳細(xì),需要的朋友可以參考下2023-08-08
如何使用spring ResponseEntity處理http響應(yīng)
這篇文章主要介紹了如何使用spring ResponseEntity處理http響應(yīng)的操作,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07
Java中MyBatis Plus知識點(diǎn)總結(jié)
在本篇文章里小編給大家整理一篇關(guān)于Java中MyBatis Plus知識點(diǎn)總結(jié),需要的朋友們參考下。2019-10-10

