Spring?Boot讀取配置文件的五種方式小結(jié)
Spring Boot 提供了靈活多樣的方式來讀取配置文件(如 application.yml 或 application.properties),本文介紹幾種常見的讀取方式。
1. 配置文件位置與加載順序
Spring Boot 默認(rèn)從以下位置加載配置文件(優(yōu)先級從高到低):
命令行參數(shù)(如:--server.port=8081)
application.properties / application.yml(位于 classpath:/config/)
classpath:/application.properties 或 application.yml
外部配置中心(如 Nacos、Spring Cloud Config)
2. 讀取配置文件的方式匯總
Spring Boot 提供了多種讀取配置文件的方式。
方式一:使用 @Value 注解讀取配置
這種方式適合讀取單個(gè)簡單配置項(xiàng)。可以用來注入配置文件中的值,也可以指定默認(rèn)值,防止配置項(xiàng)缺失時(shí)拋出異常 。
配置文件:
app: name: order-v version: v1
示例代碼:
@Component
public class AppProperties {
@Value("${app.name:order}")
private String name;
@Value("${app.version:v1.0.0}")
private String version;
public void print() {
System.out.println("App Name: " + name);
System.out.println("App Version: " + version);
}
}
:后面就是默認(rèn)值- 當(dāng)配置文件中沒有對應(yīng)的值時(shí),會使用默認(rèn)值
- 如果配置項(xiàng)存在對應(yīng)的值,默認(rèn)值不生效
測試代碼:
@RestController
@RequestMapping("/test")
@AllArgsConstructor
public class TestController {
private final AppProperties appProperties;
@RequestMapping("/print")
public void print() {
appProperties.print();
}
}
? 優(yōu)點(diǎn):
簡單直接,適用于讀取單個(gè)變量
? 缺點(diǎn):
不支持嵌套結(jié)構(gòu)、不支持批量綁定、不利于維護(hù)
方式二:使用 @ConfigurationProperties 自動(dòng)綁定配置類(推薦)
適合綁定多個(gè)字段、嵌套結(jié)構(gòu)、List、Map等復(fù)雜配置。
配置文件:
app:
name: order-v
version: v1
servers:
- http://dev-server:8080
- http://test-server:8081
- http://prod-server:8082
metadata:
author: Alice
version: 1.0.2
website: https://emp.com
modules:
user:
enabled: true
path: /user
admin:
enabled: false
path: /admin配置類示例代碼:
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Map;
@Component
@ConfigurationProperties(prefix = "app")
@Data
public class AppProperties {
private String name;
// List 示例
private List<String> servers;
// Map<String, String> 示例
private Map<String, String> metadata;
// Map<String, 自定義對象> 示例
private Map<String, Module> modules;
@Data
public static class Module {
private boolean enabled;
private String path;
}
public void print() {
System.out.println("name: " + name);
System.out.println("servers: " + servers);
System.out.println("metadata: " + metadata);
System.out.println("modules: " + modules);
}
}
使用示例:
import com.example.xiaoshitou.config.AppConfigProperties;
import com.example.xiaoshitou.config.AppProperties;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/test")
@AllArgsConstructor
public class TestController {
private final AppProperties appProperties;
private final AppConfigProperties appConfigProperties;
@RequestMapping("/print")
public void print() {
appProperties.print();
}
@RequestMapping("/printConfig")
public void printConfig() {
appConfigProperties.print();
}
}
? 優(yōu)點(diǎn):
- 支持對象結(jié)構(gòu)、嵌套對象、List、Map
- 支持校驗(yàn)(配合 @Validated)
- 強(qiáng)類型綁定,IDE 支持友好
? 缺點(diǎn):
需要額外的類定義
方式三:使用 Environment 編程式讀取配置
適合動(dòng)態(tài)讀取、條件判斷場景。
示例代碼:
import com.example.xiaoshitou.config.AppConfigProperties;
import com.example.xiaoshitou.config.AppProperties;
import com.example.xiaoshitou.config.SmsConfig;
import lombok.AllArgsConstructor;
import org.springframework.core.env.Environment;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/***
* @title
* @author shijiangyong
* @date 2025/4/24 17:28
**/
@RestController
@RequestMapping("/test")
@AllArgsConstructor
public class TestController {
private final AppProperties appProperties;
private final AppConfigProperties appConfigProperties;
private final Environment env;
@RequestMapping("/print")
public void print() {
appProperties.print();
}
@RequestMapping("/printConfig")
public void printConfig() {
appConfigProperties.print();
}
@RequestMapping("/printEnv")
public void printEnv() {
String name = env.getProperty("app.name");
System.out.println("app.name = " + name);
}
}
? 優(yōu)點(diǎn):
- 動(dòng)態(tài)、靈活,支持條件判斷
- 可用于第三方庫或工具類中
? 缺點(diǎn):
可讀性差,不支持自動(dòng)綁定
方式四:加載自定義配置文件(@PropertySource)
當(dāng)你需要讀取非 application.yml 的配置文件時(shí)使用。
自定義配置文件 sms-config.properties:
sms.sign=aliyun sms.template.code=TPL001
示例代碼:
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
/***
* @title
* @author shijiangyong
* @date 2025/4/25 10:08
**/
@Configuration
@PropertySource("classpath:sms-config.properties")
@ConfigurationProperties(prefix = "sms")
@Data
public class SmsConfig {
private String sign;
private Template template;
@Data
public static class Template {
private String code;
}
public void print() {
System.out.println("sign : " + sign);
System.out.println("template.code : " + template.getCode());
}
}
使用示例:
import com.example.xiaoshitou.config.AppConfigProperties;
import com.example.xiaoshitou.config.AppProperties;
import com.example.xiaoshitou.config.SmsConfig;
import lombok.AllArgsConstructor;
import org.springframework.core.env.Environment;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/***
* @title
* @author shijiangyong
* @date 2025/4/24 17:28
**/
@RestController
@RequestMapping("/test")
@AllArgsConstructor
public class TestController {
private final AppProperties appProperties;
private final AppConfigProperties appConfigProperties;
private final SmsConfig smsConfig;
private final Environment env;
@RequestMapping("/print")
public void print() {
appProperties.print();
}
@RequestMapping("/printConfig")
public void printConfig() {
appConfigProperties.print();
}
@RequestMapping("/printEnv")
public void printEnv() {
String name = env.getProperty("app.name");
System.out.println("app.name = " + name);
}
@RequestMapping("/smsConfig")
public void smsConfig() {
smsConfig.print();
}
}
? 優(yōu)點(diǎn):
- 支持加載自定義配置文件
- 可與 @ConfigurationProperties 搭配使用
? 缺點(diǎn):
- 不支持 .yml 格式
- 不支持動(dòng)態(tài)刷新
方式五:多環(huán)境配置(多 Profile)
適用于開發(fā)、測試、生產(chǎn)環(huán)境的配置隔離。
配置文件:
# application-dev.yml app: name: DevApp # application-prod.yml app: name: ProdApp
激活方式:
在 application.yml 中設(shè)置:
spring:
profiles:
active: dev
或通過啟動(dòng)參數(shù):
--spring.profiles.active=prod
? 優(yōu)點(diǎn):
- 多環(huán)境隔離,配置清晰
- 支持組合激活多個(gè) profile
總結(jié)
| 場景 | 推薦方式 |
|---|---|
| 讀取單個(gè)簡單值 | @Value |
| 讀取嵌套結(jié)構(gòu)、對象 | @ConfigurationProperties |
| 動(dòng)態(tài)讀取 | Environment |
| 非默認(rèn)配置文件 | @PropertySource |
| 多環(huán)境支持 | 多 profile |
以上就是Spring Boot讀取配置文件的五種方式小結(jié)的詳細(xì)內(nèi)容,更多關(guān)于Spring Boot讀取配置文件的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
springboot使用國產(chǎn)加密算法方式,sm2和sm3加解密demo
這篇文章主要介紹了springboot使用國產(chǎn)加密算法方式,sm2和sm3加解密demo,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07
Spring Boot MyBatis 連接數(shù)據(jù)庫配置示例
本篇文章主要介紹了Spring Boot MyBatis 連接數(shù)據(jù)庫示例的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-02-02
詳解SpringBoot中@PostMapping注解的用法
在SpringBoot中,我們經(jīng)常需要編寫RESTful Web服務(wù),以便于客戶端與服務(wù)器之間的通信,@PostMapping注解可以讓我們更方便地編寫POST請求處理方法,在本文中,我們將介紹@PostMapping注解的作用、原理,以及如何在SpringBoot應(yīng)用程序中使用它2023-06-06
java實(shí)現(xiàn)文件導(dǎo)入導(dǎo)出
這篇文章主要介紹了java實(shí)現(xiàn)文件導(dǎo)入導(dǎo)出的方法和具體示例代碼,非常的簡單實(shí)用,有需要的小伙伴可以參考下2016-04-04
java中split()方法以及常見算法經(jīng)典案例
這篇文章主要介紹了java中split()方法以及常見算法的相關(guān)資料,split()方法可以根據(jù)指定的正則表達(dá)式將字符串分割成多個(gè)子字符串,并返回一個(gè)字符串?dāng)?shù)組,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-04-04
java正則表達(dá)式提取數(shù)字的方法實(shí)例
這篇文章主要介紹了java正則表達(dá)式提取數(shù)字的方法,還有去除字符串?dāng)?shù)字的方法,大家參考使用吧2013-12-12
Spring Boot 的java -jar命令啟動(dòng)原理詳解
這篇文章主要介紹了Spring Boot 的java -jar命令啟動(dòng)原理詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01

