SpringBoot多環(huán)境配置數(shù)據(jù)讀取方式
一個SpringBoot項目在實際開發(fā)中通常需要在開發(fā)環(huán)境、測試環(huán)境和生產(chǎn)環(huán)境中切換運行,而不同環(huán)境的配置(如數(shù)據(jù)庫連接、端口號、日志級別)往往不同,手動修改配置不僅繁瑣,還容易出錯,而SpringBoot提供了靈活的多環(huán)境配置機制。
一、多環(huán)境配置的核心思路
多環(huán)境配置的核心是“環(huán)境隔離”:將不同環(huán)境的配置分離到獨立文件中,通過指定“環(huán)境標識”自動加載對應(yīng)配置。
核心優(yōu)勢:
- 避免手動修改配置,減少人為錯誤;
- 配置與環(huán)境強關(guān)聯(lián),清晰易維護;
- 支持靈活切換環(huán)境,適應(yīng)不同階段需求。
二、3種配置文件格式詳解
SpringBoot支持properties、yaml和yml三種配置文件格式,其中yaml/yml以簡潔的縮進語法更受歡迎。
2.1 properties格式(傳統(tǒng)格式)
properties文件采用key=value格式,多環(huán)境配置通過“文件名+環(huán)境標識”區(qū)分。
1. 基礎(chǔ)配置文件(application.properties)
存放公共配置(所有環(huán)境共享的配置):
# 公共配置(所有環(huán)境共享) server.port=8080 # 默認端口(可被環(huán)境配置覆蓋) spring.application.name=multi-env-demo
2. 環(huán)境專屬配置文件
開發(fā)環(huán)境:application-dev.properties
# 開發(fā)環(huán)境配置 server.port=8081 spring.datasource.url=jdbc:mysql://localhost:3306/dev_db spring.datasource.username=dev_user spring.datasource.password=dev_pwd
測試環(huán)境:application-test.properties
# 測試環(huán)境配置 server.port=8082 spring.datasource.url=jdbc:mysql://test-server:3306/test_db spring.datasource.username=test_user spring.datasource.password=test_pwd
生產(chǎn)環(huán)境:application-prod.properties
# 生產(chǎn)環(huán)境配置 server.port=80 spring.datasource.url=jdbc:mysql://prod-server:3306/prod_db spring.datasource.username=prod_user spring.datasource.password=prod_pwd
2.2 yaml/yml格式(推薦)
yaml和yml是同一種格式(后綴不同),采用縮進+鍵值對語法,結(jié)構(gòu)清晰,支持列表和嵌套。
1. 單文件多環(huán)境配置(推薦)
yaml支持在一個文件中通過spring.profiles區(qū)分環(huán)境,無需創(chuàng)建多個文件:
# application.yml
# 公共配置
spring:
application:
name: multi-env-demo
profiles:
active: dev # 默認激活開發(fā)環(huán)境
# 開發(fā)環(huán)境(通過---分隔)
---
spring:
profiles: dev
server:
port: 8081
spring:
datasource:
url: jdbc:mysql://localhost:3306/dev_db
username: dev_user
password: dev_pwd
# 測試環(huán)境
---
spring:
profiles: test
server:
port: 8082
spring:
datasource:
url: jdbc:mysql://test-server:3306/test_db
username: test_user
password: test_pwd
# 生產(chǎn)環(huán)境
---
spring:
profiles: prod
server:
port: 80
spring:
datasource:
url: jdbc:mysql://prod-server:3306/prod_db
username: prod_user
password: prod_pwd語法說明:
- 用
---分隔不同環(huán)境的配置塊; spring.profiles: dev指定環(huán)境標識(與properties的-dev對應(yīng));spring.profiles.active: dev指定默認激活的環(huán)境。
2. 多文件yaml配置(類似properties)
也可將不同環(huán)境配置拆分到獨立文件:
- 公共配置:
application.yml - 開發(fā)環(huán)境:
application-dev.yml - 測試環(huán)境:
application-test.yml - 生產(chǎn)環(huán)境:
application-prod.yml
2.3 三種格式的對比與選擇
| 格式 | 語法特點 | 優(yōu)勢 | 劣勢 | 適用場景 |
|---|---|---|---|---|
| properties | key=value,無縮進 | 兼容性好,適合簡單配置 | 冗余代碼多,不支持嵌套 | 傳統(tǒng)項目、簡單配置 |
| yaml/yml | 縮進語法,支持嵌套 | 簡潔直觀,支持復雜結(jié)構(gòu) | 對縮進敏感(空格錯誤易出錯) | 推薦使用,尤其是復雜配置 |
建議:優(yōu)先使用單文件yaml配置,減少文件數(shù)量,提高維護效率。
三、多環(huán)境配置的數(shù)據(jù)讀取方式
SpringBoot提供了多種方式讀取配置文件中的數(shù)據(jù),滿足不同場景需求。
3.1 @Value注解(簡單值讀?。?/h3>
@Value("${key}")用于讀取簡單類型的配置(字符串、數(shù)字等),直接注入到變量中。
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class EnvController {
// 讀取端口號
@Value("${server.port}")
private int port;
// 讀取數(shù)據(jù)庫URL(支持默認值:${key:默認值})
@Value("${spring.datasource.url:jdbc:mysql://localhost:3306/default_db}")
private String dbUrl;
@GetMapping("/env")
public String getEnvInfo() {
return "當前端口:" + port + ",數(shù)據(jù)庫地址:" + dbUrl;
}
}特點:
- 適用于讀取零散的簡單配置;
- 支持默認值(
${key:默認值}),當配置不存在時使用默認值; - 不適合讀取復雜對象(如嵌套結(jié)構(gòu))。
3.2 Environment對象(靈活讀取)
Environment是Spring的核心接口,可通過getProperty("key")方法動態(tài)讀取配置,支持默認值和類型轉(zhuǎn)換。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class EnvController {
@Autowired
private Environment env;
@GetMapping("/env2")
public String getEnvInfo2() {
// 讀取字符串
String username = env.getProperty("spring.datasource.username");
// 讀取整數(shù)(指定類型)
Integer port = env.getProperty("server.port", Integer.class);
// 讀取并指定默認值
String driver = env.getProperty("spring.datasource.driver-class-name",
"com.mysql.cj.jdbc.Driver");
return "用戶名:" + username + ",端口:" + port + ",驅(qū)動:" + driver;
}
}特點:
- 適合動態(tài)讀取配置(如根據(jù)條件讀取不同key);
- 支持類型轉(zhuǎn)換(無需手動強轉(zhuǎn));
- 需注入
Environment對象,稍顯繁瑣。
3.3 @ConfigurationProperties(對象封裝,推薦)
@ConfigurationProperties用于將配置文件中的一組相關(guān)配置封裝為Java對象,適合讀取復雜配置(如數(shù)據(jù)庫連接信息、自定義配置)。
步驟1:定義配置類并綁定配置
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
// 綁定前綴為"spring.datasource"的配置
@ConfigurationProperties(prefix = "spring.datasource")
@Component // 注冊為Spring組件
public class DataSourceProperties {
private String url;
private String username;
private String password;
private String driverClassName;
// 必須提供getter和setter(Spring通過setter注入)
public String getUrl() { return url; }
public void setUrl(String url) { this.url = url; }
public String getUsername() { return username; }
public void setUsername(String username) { this.username = username; }
public String getPassword() { return password; }
public void setPassword(String password) { this.password = password; }
public String getDriverClassName() { return driverClassName; }
public void setDriverClassName(String driverClassName) { this.driverClassName = driverClassName; }
}步驟2:在配置文件中添加對應(yīng)配置
# application.yml(開發(fā)環(huán)境)
spring:
datasource:
url: jdbc:mysql://localhost:3306/dev_db
username: dev_user
password: dev_pwd
driver-class-name: com.mysql.cj.jdbc.Driver步驟3:使用配置對象
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class EnvController {
@Autowired
private DataSourceProperties dataSourceProps;
@GetMapping("/db")
public String getDbInfo() {
return "數(shù)據(jù)庫配置:" +
"URL=" + dataSourceProps.getUrl() +
",用戶名=" + dataSourceProps.getUsername();
}
}特點:
- 適合讀取一組相關(guān)配置(如數(shù)據(jù)庫、緩存、第三方API等);
- 支持嵌套結(jié)構(gòu)(如
spring.redis.host、spring.redis.port可封裝為RedisProperties); - 配合
@Validated可實現(xiàn)配置校驗(如非空檢查、格式校驗)。
四、自定義對象封裝(復雜配置示例)
對于自定義的復雜配置(如支付接口參數(shù)、緩存策略),@ConfigurationProperties同樣適用。
示例:封裝支付接口配置
1. 配置文件(application.yml)
# 自定義支付配置
pay:
api:
url: https://pay-dev-api.com
timeout: 3000 # 超時時間(毫秒)
merchant:
id: dev_merchant_123
key: dev_pay_key
supported-types: # 支持的支付方式(列表)
- WECHAT
- ALIPAY2. 定義配置類
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.List;
@ConfigurationProperties(prefix = "pay")
@Component
public class PayProperties {
private Api api;
private Merchant merchant;
private List<String> supportedTypes;
// 內(nèi)部類:API配置
public static class Api {
private String url;
private int timeout;
// getter和setter
}
// 內(nèi)部類:商戶配置
public static class Merchant {
private String id;
private String key;
// getter和setter
}
// 外部類的getter和setter
public Api getApi() { return api; }
public void setApi(Api api) { this.api = api; }
public Merchant getMerchant() { return merchant; }
public void setMerchant(Merchant merchant) { this.merchant = merchant; }
public List<String> getSupportedTypes() { return supportedTypes; }
public void setSupportedTypes(List<String> supportedTypes) { this.supportedTypes = supportedTypes; }
}3. 使用自定義配置
@Autowired
private PayProperties payProps;
@GetMapping("/pay")
public String getPayInfo() {
return "支付API:" + payProps.getApi().getUrl() +
",支持方式:" + payProps.getSupportedTypes();
}五、多環(huán)境啟動方式
SpringBoot提供了多種方式指定激活的環(huán)境,靈活滿足不同場景(開發(fā)、測試、部署)。
5.1 配置文件中指定(默認方式)
在application.yml或application.properties中通過spring.profiles.active指定:
# application.yml
spring:
profiles:
active: test # 默認激活測試環(huán)境# application.properties spring.profiles.active=prod # 默認激活生產(chǎn)環(huán)境
5.2 命令行參數(shù)指定(優(yōu)先級最高)
啟動jar包時通過--spring.profiles.active參數(shù)指定環(huán)境,優(yōu)先級高于配置文件:
# 啟動開發(fā)環(huán)境 java -jar multi-env-demo.jar --spring.profiles.active=dev # 啟動生產(chǎn)環(huán)境(指定端口) java -jar multi-env-demo.jar --spring.profiles.active=prod --server.port=8080
優(yōu)勢:部署時無需修改配置文件,直接通過命令切換環(huán)境。
5.3 IDE中指定(開發(fā)調(diào)試)
在IDEA/Eclipse中配置啟動參數(shù),方便開發(fā)調(diào)試:
IDEA配置步驟:
- 打開Run/Debug Configurations;
- 在Program arguments中添加:
--spring.profiles.active=dev; - 啟動項目,自動加載開發(fā)環(huán)境配置。
5.4 環(huán)境變量指定(服務(wù)器部署)
在服務(wù)器中通過環(huán)境變量SPRING_PROFILES_ACTIVE指定,適合容器化部署(如Docker、K8s):
# Linux環(huán)境設(shè)置環(huán)境變量 export SPRING_PROFILES_ACTIVE=prod # 啟動項目(自動讀取環(huán)境變量) java -jar multi-env-demo.jar
Docker示例:
FROM openjdk:8-jdk-slim ENV SPRING_PROFILES_ACTIVE=prod # 設(shè)置環(huán)境變量 COPY target/multi-env-demo.jar app.jar ENTRYPOINT ["java", "-jar", "/app.jar"]
六、Maven多環(huán)境控制(兼容聯(lián)動)
通過Maven的profiles配置,可在打包時自動指定SpringBoot的激活環(huán)境,實現(xiàn)“一次打包,多環(huán)境部署”。
6.1 配置pom.xml
在pom.xml中定義Maven環(huán)境,并通過resource filtering替換配置文件中的占位符:
<project>
<!-- ... 其他配置 ... -->
<profiles>
<!-- 開發(fā)環(huán)境 -->
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault> <!-- 默認激活開發(fā)環(huán)境 -->
</activation>
<properties>
<spring.profile.active>dev</spring.profile.active> <!-- 對應(yīng)Spring環(huán)境標識 -->
</properties>
</profile>
<!-- 測試環(huán)境 -->
<profile>
<id>test</id>
<properties>
<spring.profile.active>test</spring.profile.active>
</properties>
</profile>
<!-- 生產(chǎn)環(huán)境 -->
<profile>
<id>prod</id>
<properties>
<spring.profile.active>prod</spring.profile.active>
</properties>
</profile>
</profiles>
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<!-- 開啟資源過濾:替換配置文件中的${變量} -->
<filtering>true</filtering>
</resource>
</resources>
</build>
</project>6.2 修改配置文件(使用Maven變量)
在application.yml中用@spring.profile.active@引用Maven變量:
# application.yml
spring:
profiles:
active: @spring.profile.active@ # 由Maven打包時替換6.3 打包與啟動
通過Maven命令指定環(huán)境打包,生成的jar包會自動激活對應(yīng)環(huán)境:
# 打包開發(fā)環(huán)境(默認) mvn clean package # 打包測試環(huán)境 mvn clean package -P test # 打包生產(chǎn)環(huán)境 mvn clean package -P prod
啟動jar包時無需再指定環(huán)境(已由Maven固化到配置中):
java -jar target/multi-env-demo.jar # 自動使用打包時指定的環(huán)境
優(yōu)勢:
- 打包時綁定環(huán)境,避免部署時誤操作;
- 適合CI/CD流程(如Jenkins根據(jù)分支自動選擇環(huán)境打包)。
七、常見問題與避坑指南
7.1 配置文件優(yōu)先級問題
SpringBoot配置文件的加載順序(優(yōu)先級從高到低):
- 命令行參數(shù)(
--spring.profiles.active=dev); - 環(huán)境變量(
SPRING_PROFILES_ACTIVE=dev); - 系統(tǒng)屬性(如
-Dspring.profiles.active=dev); application-{profile}.yml(環(huán)境專屬文件);application.yml(公共配置文件);- 類路徑下的
config目錄(src/main/resources/config/)中的配置文件; - 類路徑根目錄(
src/main/resources/)中的配置文件。
避坑點:若同一配置在多個地方定義,高優(yōu)先級配置會覆蓋低優(yōu)先級配置。例如,命令行指定的server.port=8888會覆蓋配置文件中的server.port=8080。
建議:開發(fā)環(huán)境用配置文件默認值,測試/生產(chǎn)環(huán)境通過命令行或環(huán)境變量指定,避免配置文件沖突。
7.2 配置沖突與覆蓋規(guī)則
當公共配置與環(huán)境專屬配置存在相同key時,環(huán)境專屬配置會覆蓋公共配置。
示例:
# 公共配置(application.yml)
server:
port: 8080
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
# 開發(fā)環(huán)境配置(application-dev.yml)
server:
port: 8081 # 覆蓋公共配置的8080
spring:
datasource:
url: jdbc:mysql://localhost:3306/dev_db # 新增配置結(jié)果:開發(fā)環(huán)境最終端口為8081,數(shù)據(jù)庫驅(qū)動沿用公共配置的com.mysql.cj.jdbc.Driver。
注意:若同一環(huán)境配置在多個文件中定義(如application-dev.yml和application-dev.properties),properties文件優(yōu)先級高于yaml文件(因文件格式優(yōu)先級)。
7.3 敏感信息泄露問題
配置文件中的數(shù)據(jù)庫密碼、API密鑰等敏感信息直接明文存儲,存在安全風險。
解決方案:
- Spring Cloud Config/Spring Cloud Vault:集中管理配置,加密存儲敏感信息(適合微服務(wù)架構(gòu));
- Jasypt加密:通過jasypt對敏感信息加密,項目啟動時解密。
Jasypt使用示例:
- 引入依賴:
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>3.0.4</version>
</dependency>- 配置加密密鑰(生產(chǎn)環(huán)境通過命令行傳入,避免硬編碼):
jasypt:
encryptor:
password: ${JASYPT_PASSWORD:dev_key} # 開發(fā)環(huán)境默認密鑰,生產(chǎn)環(huán)境從環(huán)境變量獲取- 生成加密后的密碼(通過代碼或命令行):
import org.jasypt.encryption.StringEncryptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
@Component
public class EncryptRunner implements CommandLineRunner {
@Autowired
private StringEncryptor encryptor;
@Override
public void run(String... args) throws Exception {
String password = "prod_pwd";
String encrypted = encryptor.encrypt(password);
System.out.println("加密后:" + encrypted); // 輸出如:EbfYkitulv73I2p0mXI50Q==
}
}- 在配置文件中使用加密值(用
ENC()包裹):
spring:
datasource:
password: ENC(EbfYkitulv73I2p0mXI50Q==)7.4 多環(huán)境下的配置激活失敗
常見原因:
- 環(huán)境標識拼寫錯誤(如
spring.profiles.active: deve,正確應(yīng)為dev); - 配置文件命名錯誤(如
application-devl.yml,正確應(yīng)為application-dev.yml); - 單文件yaml中未用
---分隔環(huán)境塊,導致配置不生效; - Maven過濾未開啟,
@spring.profile.active@未被正確替換。
排查步驟:
- 檢查啟動日志,搜索
The following profiles are active,確認激活的環(huán)境是否正確; - 檢查配置文件路徑和命名,確保與環(huán)境標識匹配;
- 若使用Maven多環(huán)境,打包后解壓jar包,查看
BOOT-INF/classes/application.yml中spring.profiles.active是否被正確替換。
7.5 復雜配置的校驗問題
使用@ConfigurationProperties封裝配置時,若配置缺失或格式錯誤,可能導致業(yè)務(wù)異常。
解決方案:通過@Validated和JSR-303注解(如@NotNull、@Min)進行配置校驗。
示例:
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotEmpty;
@ConfigurationProperties(prefix = "pay.api")
@Component
@Validated // 開啟校驗
public class PayApiProperties {
@NotEmpty(message = "支付API地址不能為空")
private String url;
@Min(value = 1000, message = "超時時間不能小于1000毫秒")
private int timeout;
// getter和setter
}若配置缺失或不符合規(guī)則,項目啟動時會直接報錯,避免運行時異常:
Binding to target org.springframework.boot.context.properties.bind.BindException:
Failed to bind properties under 'pay.api' to com.example.config.PayApiProperties failed:
Property: pay.api.url
Value: null
Reason: 支付API地址不能為空總結(jié)
SpringBoot多環(huán)境配置的核心是“隔離與靈活切換”,結(jié)合實際開發(fā)經(jīng)驗,最佳實踐如下:
- 配置文件格式:優(yōu)先使用單文件yaml配置,通過
---分隔環(huán)境,減少文件數(shù)量; - 配置讀取:簡單配置用
@Value,復雜配置用@ConfigurationProperties(配合校驗); - 環(huán)境激活:開發(fā)環(huán)境用配置文件默認值,測試/生產(chǎn)環(huán)境通過命令行參數(shù)或環(huán)境變量指定,避免修改配置文件;
- 敏感信息:禁止明文存儲,使用Jasypt加密或配置中心管理;
- Maven聯(lián)動:通過Maven profiles實現(xiàn)“打包綁定環(huán)境”,適合CI/CD自動化部署;
- 配置校驗:對核心配置添加校驗規(guī)則,確保啟動階段暴露問題。
到此這篇關(guān)于SpringBoot之多環(huán)境配置全解析的文章就介紹到這了,更多相關(guān)SpringBoot多環(huán)境配置內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot配置文件、多環(huán)境配置、讀取配置的4種實現(xiàn)方式
- SpringBoot使用YML文件進行多環(huán)境配置的三種方法
- 一文掌握SpringBoot多環(huán)境配置
- SpringBoot中yml多環(huán)境配置的3種方法
- springboot使用yml文件配置多環(huán)境方式(dev、test、prod)
- SpringBoot加載多個配置文件實現(xiàn)dev、product多環(huán)境切換的方法
- SpringBoot實現(xiàn)多環(huán)境配置文件切換教程詳解
- springboot多模塊多環(huán)境配置文件問題(動態(tài)配置生產(chǎn)和開發(fā)環(huán)境)
- springboot多環(huán)境配置方案(不用5分鐘)
- 走進SpringBoot之配置文件與多環(huán)境詳解
- springboot多環(huán)境(dev、test、prod)配置詳解
相關(guān)文章
Java GUI編程之貪吃蛇游戲簡單實現(xiàn)方法【附demo源碼下載】
這篇文章主要介紹了Java GUI編程之貪吃蛇游戲簡單實現(xiàn)方法,詳細分析了貪吃蛇游戲的具體實現(xiàn)步驟與相關(guān)注意事項,并附帶demo源碼供讀者下載參考,需要的朋友可以參考下2017-09-09

