Spring Boot中讀取配置文件的5種方式匯總(最新整理)
在 Spring Boot 中,讀取配置文件(如 application.properties/application.yml)的方式豐富且靈活,核心可分為基礎(chǔ)注解式、編程式、類型安全綁定三大類,以下是主流方式的詳細(xì)總結(jié):
一、核心前提:配置文件基礎(chǔ)
Spring Boot 默認(rèn)加載 src/main/resources 下的 application.properties 或 application.yml,也可通過 spring.config.name/spring.config.location 自定義配置文件路徑。
方式1:@Value 注解(基礎(chǔ)單個(gè)屬性讀?。?/h2>
核心特點(diǎn)
最基礎(chǔ)、輕量的方式,直接綁定單個(gè)配置項(xiàng)到字段/方法參數(shù),支持簡單類型轉(zhuǎn)換、默認(rèn)值、SpEL 表達(dá)式。
使用示例
1. 配置文件(application.yml)
app:
name: demo-app
port: 8080
desc: ${app.name}-${app.port} # SpEL 拼接2. 代碼綁定
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class AppConfig {
// 直接綁定單個(gè)屬性
@Value("${app.name}")
private String appName;
// 綁定并設(shè)置默認(rèn)值(配置不存在時(shí)使用)
@Value("${app.version:1.0.0}")
private String appVersion;
// 綁定 SpEL 拼接的屬性
@Value("${app.desc}")
private String appDesc;
}優(yōu)缺點(diǎn)
- ? 優(yōu)點(diǎn):簡單易用,適合少量零散配置;
- ? 缺點(diǎn):不支持復(fù)雜對(duì)象、無類型校驗(yàn)、配置多時(shí)代碼冗余,無法自動(dòng)刷新(需結(jié)合
@RefreshScope)。
方式2:@ConfigurationProperties(類型安全綁定,推薦)
核心特點(diǎn)
將一組相關(guān)配置綁定到 Java 實(shí)體類,支持嵌套對(duì)象、類型校驗(yàn)、前綴分組,是 Spring Boot 推薦的配置綁定方式。
使用步驟
1. 配置文件(application.yml)
app:
name: demo-app
port: 8080
database:
url: jdbc:mysql://localhost:3306/test
username: root
password: 123456
servers:
- 192.168.1.1
- 192.168.1.22. 綁定實(shí)體類
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.List;
// 前綴指定配置分組,需配合 @Component 或 @EnableConfigurationProperties 生效
@Component
@ConfigurationProperties(prefix = "app")
public class AppProperties {
private String name;
private Integer port;
private Database database; // 嵌套對(duì)象
private List<String> servers; // 集合
// 嵌套類
public static class Database {
private String url;
private String username;
private String password;
// getter/setter
}
// 必須提供 getter/setter(Spring 反射賦值)
public String getName() { return name; }
public void setName(String name) { this.name = name; }
// 其他字段的 getter/setter
}3. 啟用配置(可選)
若實(shí)體類未加 @Component,需在配置類中通過 @EnableConfigurationProperties 啟用:
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableConfigurationProperties(AppProperties.class)
public class Config {
}增強(qiáng)特性
- 支持 JSR-380 校驗(yàn)(加
@Validated+ 校驗(yàn)注解):@Component @ConfigurationProperties(prefix = "app") @Validated public class AppProperties { @NotBlank(message = "應(yīng)用名稱不能為空") private String name; // ... } - 支持配置自動(dòng)刷新(結(jié)合
@RefreshScope)。
優(yōu)缺點(diǎn)
- ? 優(yōu)點(diǎn):類型安全、支持嵌套/集合、配置分組清晰、可校驗(yàn);
- ? 缺點(diǎn):需編寫實(shí)體類,略繁瑣(但可通過 Lombok 簡化)。
方式3:Environment 接口(編程式讀?。?/h2>
核心特點(diǎn)
Spring 核心環(huán)境接口,可動(dòng)態(tài)讀取所有配置(包括系統(tǒng)屬性、環(huán)境變量、配置文件),支持配置占位符解析。
使用示例
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;
@Component
public class EnvConfig {
@Autowired
private Environment env;
public void getConfig() {
// 讀取單個(gè)配置
String appName = env.getProperty("app.name");
// 讀取并指定默認(rèn)值
Integer appPort = env.getProperty("app.port", Integer.class, 8080);
// 讀取嵌套配置
String dbUrl = env.getProperty("app.database.url");
}
}擴(kuò)展能力
- 支持配置文件激活:
env.getActiveProfiles()(獲取激活的環(huán)境,如 dev/prod); - 支持判斷配置是否存在:
env.containsProperty("app.name")。
優(yōu)缺點(diǎn)
- ? 優(yōu)點(diǎn):靈活,支持動(dòng)態(tài)讀取、多環(huán)境適配,無需綁定實(shí)體類;
- ? 缺點(diǎn):無類型安全(需手動(dòng)轉(zhuǎn)換類型)、零散讀取時(shí)代碼冗余。
方式4:原生 Properties/yml 讀取(手動(dòng)加載)
核心特點(diǎn)
脫離 Spring 容器,手動(dòng)加載配置文件(適合非 Spring 管理的代碼),支持 properties 和 yml 格式。
示例1:手動(dòng)讀取 properties 文件
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
public class ManualPropertiesReader {
public static void main(String[] args) throws IOException {
Properties props = new Properties();
// 加載 classpath 下的配置文件
try (InputStream is = ManualPropertiesReader.class.getClassLoader().getResourceAsStream("application.properties")) {
props.load(is);
String appName = props.getProperty("app.name");
}
}
}示例2:手動(dòng)讀取 yml 文件(需依賴 snakeyaml)
<!-- pom.xml 引入依賴 -->
<dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
</dependency>import org.yaml.snakeyaml.Yaml;
import java.io.InputStream;
import java.util.Map;
public class ManualYmlReader {
public static void main(String[] args) {
Yaml yaml = new Yaml();
try (InputStream is = ManualYmlReader.class.getClassLoader().getResourceAsStream("application.yml")) {
Map<String, Object> data = yaml.load(is);
// 讀取嵌套配置
Map<String, Object> app = (Map<String, Object>) data.get("app");
String appName = (String) app.get("name");
}
}
}優(yōu)缺點(diǎn)
- ? 優(yōu)點(diǎn):完全脫離 Spring,靈活控制加載邏輯;
- ? 缺點(diǎn):需手動(dòng)處理文件加載、類型轉(zhuǎn)換、嵌套結(jié)構(gòu),無 Spring 自動(dòng)裝配能力。
方式5:@PropertySource 加載自定義配置文件
核心特點(diǎn)
加載非默認(rèn)名稱/路徑的配置文件(如 custom.properties),配合 @Value 或 @ConfigurationProperties 使用。
使用示例
1. 自定義配置文件(custom.properties)
custom.name=my-custom-app custom.age=20
2. 加載并綁定
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
import org.springframework.beans.factory.annotation.Value;
@Component
// 加載自定義 properties 文件(僅支持 properties,不直接支持 yml)
@PropertySource("classpath:custom.properties")
public class CustomConfig {
@Value("${custom.name}")
private String customName;
}擴(kuò)展:加載 yml 文件(需自定義工廠)
@PropertySource 原生不支持 yml,需自定義 PropertySourceFactory:
import org.springframework.core.env.MapPropertySource;
import org.springframework.core.io.support.EncodedResource;
import org.springframework.core.io.support.PropertySourceFactory;
import org.yaml.snakeyaml.Yaml;
import java.util.Map;
public class YmlPropertySourceFactory implements PropertySourceFactory {
@Override
public org.springframework.core.env.PropertySource<?> createPropertySource(String name, EncodedResource resource) {
Yaml yaml = new Yaml();
Map<String, Object> data = yaml.load(resource.getInputStream());
return new MapPropertySource(resource.getResource().getFilename(), data);
}
}使用:
@PropertySource(value = "classpath:custom.yml", factory = YmlPropertySourceFactory.class)
@Component
public class CustomYmlConfig {
@Value("${custom.name}")
private String customName;
}優(yōu)缺點(diǎn)
- ? 優(yōu)點(diǎn):支持加載自定義配置文件,補(bǔ)充默認(rèn)配置;
- ? 缺點(diǎn):原生不支持 yml,需自定義工廠;多文件加載時(shí)需逐個(gè)聲明。
各方式對(duì)比與選型建議
| 方式 | 類型安全 | 支持嵌套/集合 | 配置分組 | 手動(dòng)加載 | 推薦場(chǎng)景 |
|---|---|---|---|---|---|
| @Value | ? | ? | ? | ? | 少量零散配置、簡單值綁定 |
| @ConfigurationProperties | ? | ? | ? | ? | 大量相關(guān)配置、類型安全場(chǎng)景 |
| Environment | ? | ?(手動(dòng)解析) | ? | ? | 動(dòng)態(tài)讀取、多環(huán)境適配、編程式 |
| 原生手動(dòng)加載 | ? | ?(手動(dòng)解析) | ? | ? | 非 Spring 管理代碼、自定義加載 |
| @PropertySource | 取決于綁定方式 | ? | ? | ? | 加載自定義配置文件 |
選型總結(jié)
- 日常開發(fā)優(yōu)先用
@ConfigurationProperties(類型安全、易維護(hù)); - 零散簡單配置用
@Value; - 動(dòng)態(tài)讀取/多環(huán)境適配用
Environment; - 非 Spring 代碼或自定義加載邏輯用原生手動(dòng)讀??;
- 需加載自定義配置文件時(shí)結(jié)合
@PropertySource。
到此這篇關(guān)于Spring Boot中讀取配置文件的5種方式匯總(最新整理)的文章就介紹到這了,更多相關(guān)Spring Boot讀取配置文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring MVC項(xiàng)目中l(wèi)og4J和AOP使用詳解
項(xiàng)目日志記錄是項(xiàng)目開發(fā)、運(yùn)營必不可少的內(nèi)容,有了它可以對(duì)系統(tǒng)有整體的把控,出現(xiàn)任何問題都有蹤跡可尋。下面這篇文章主要給大家介紹了關(guān)于Spring MVC項(xiàng)目中l(wèi)og4J和AOP使用的相關(guān)資料,需要的朋友可以參考下。2017-12-12
IntelliJ?IDEA?2022.2?正式發(fā)布新功能體驗(yàn)
IntelliJ?IDEA?2022.2為遠(yuǎn)程開發(fā)功能帶來了多項(xiàng)質(zhì)量改進(jìn),使其更美觀、更穩(wěn)定,新版本還具有多項(xiàng)值得注意的升級(jí)和改進(jìn),下面跟隨小編一起看看IDEA?2022.2新版本吧2022-08-08
JAVA線程sleep()和wait()詳解及實(shí)例
這篇文章主要介紹了JAVA線程sleep()和wait()詳解及實(shí)例的相關(guān)資料,探討一下sleep()和wait()方法的區(qū)別和實(shí)現(xiàn)機(jī)制,需要的朋友可以參考下2017-05-05
SpringBoot自定義RestTemplate的攔截器鏈的實(shí)戰(zhàn)指南
在項(xiàng)目開發(fā)中,RestTemplate作為Spring提供的HTTP客戶端工具,經(jīng)常用于訪問內(nèi)部或三方服務(wù),但在實(shí)際項(xiàng)目中,我們往往需要對(duì)請(qǐng)求進(jìn)行統(tǒng)一處理,所以本文給大家介紹了SpringBoot自定義RestTemplate的攔截器鏈的實(shí)戰(zhàn)指南,需要的朋友可以參考下2025-07-07

