最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot外部化配置的最佳實(shí)踐指南

 更新時(shí)間:2025年10月18日 11:27:01   作者:lang20150928  
這篇文章主要介紹了SpringBoot外部化配置的核心思想和實(shí)現(xiàn)方式,包括配置來源、加載優(yōu)先級(jí)、Profile特定配置、YAML與Properties對(duì)比、通配符路徑應(yīng)用、調(diào)試工具等內(nèi)容,為多環(huán)境部署和動(dòng)態(tài)管理配置提供了詳細(xì)實(shí)踐建議,需要的朋友可以參考下

總體理解:什么是“外部化配置”?

Externalized Configuration 的核心思想是:

把應(yīng)用程序的配置(如數(shù)據(jù)庫(kù)地址、端口號(hào)、日志級(jí)別等)從 Java 代碼中剝離出來,放在外部文件或環(huán)境中,這樣可以在不同環(huán)境(開發(fā)、測(cè)試、生產(chǎn))使用相同的代碼,但加載不同的配置。

Spring Boot 支持多種方式來實(shí)現(xiàn)配置的外部化:

  • .properties 文件
  • .yml / .yaml 文件
  • 環(huán)境變量(Environment Variables)
  • 命令行參數(shù)(Command-line arguments)
  • JSON 字符串(通過系統(tǒng)屬性或環(huán)境變量注入)
  • JNDI、Servlet 初始化參數(shù)等

這些配置最終都會(huì)被統(tǒng)一加載到 Spring 的 Environment 對(duì)象中,并可以注入到 Bean 中使用。

配置優(yōu)先級(jí)順序(PropertySource Order)

Spring Boot 有一套嚴(yán)格的配置加載順序,后加載的會(huì)覆蓋先加載的。以下是按優(yōu)先級(jí)從低到高排列的(即:后面的可以覆蓋前面的值):

優(yōu)先級(jí)來源
1Devtools 全局設(shè)置($HOME/.config/spring-boot
2@TestPropertySource 注解(測(cè)試專用)
3測(cè)試注解上的 properties 屬性(如 @SpringBootTest(properties = {...})
4命令行參數(shù)(如 --server.port=9000)? 最高優(yōu)先級(jí)之一
5SPRING_APPLICATION_JSON(內(nèi)聯(lián) JSON 字符串)
6ServletConfig 初始化參數(shù)
7ServletContext 初始化參數(shù)
8JNDI 屬性
9JVM 系統(tǒng)屬性(System.getProperties()
10操作系統(tǒng)環(huán)境變量 ? 常用于云環(huán)境
11random.* 隨機(jī)值生成器
12外部 profile-specific 配置文件(如 application-dev.properties
13內(nèi)部(jar 包內(nèi))profile-specific 配置文件
14外部 application.properties
15內(nèi)部 application.properties
16@PropertySource 注解(注意:加載較晚,不能影響早期配置)
17默認(rèn)屬性(通過 SpringApplication.setDefaultProperties() 設(shè)置)

關(guān)鍵點(diǎn):

  • 外部配置 > 內(nèi)部配置
  • Profile-specific 配置 > 普通配置
  • 命令行參數(shù) > 大多數(shù)其他方式(非常強(qiáng)大)
  • @PropertySource 加載時(shí)機(jī)較晚,不能用于控制日志、主類等早期配置

實(shí)例說明:@Value 注入配置

@Component
public class MyBean {
    @Value("${name}")
    private String name;
}

這個(gè) name 的值可以從多個(gè)地方來:

  1. jar 包內(nèi)默認(rèn)值src/main/resources/application.properties 中定義 name=defaultName
  2. 外部覆蓋:在 jar 包同目錄下放一個(gè) application.properties,寫 name=prodName → 會(huì)被優(yōu)先加載
  3. 命令行指定:運(yùn)行時(shí)加參數(shù) java -jar app.jar --name="Spring" → 最終值就是 "Spring"

這就是“一套代碼,多環(huán)境部署”的基礎(chǔ)。

調(diào)試技巧:使用 /env 和 /configprops 端點(diǎn)

Spring Boot Actuator 提供了兩個(gè)重要端點(diǎn)用于診斷配置問題:

  • /actuator/env:查看當(dāng)前所有生效的配置及其來源
  • /actuator/configprops:查看 @ConfigurationProperties 綁定的對(duì)象狀態(tài)

當(dāng)你發(fā)現(xiàn)某個(gè)配置沒生效時(shí),可以用這兩個(gè)接口查清楚它到底從哪來的、有沒有被覆蓋。

支持通配符路徑(Wildcard Locations)

Spring Boot 支持配置目錄使用通配符,例如:

--spring.config.location=config/*/  # 加載所有 config 下的子目錄

使用場(chǎng)景:Kubernetes 配置掛載

在 Kubernetes 中,你可能把不同服務(wù)的配置分別掛載為 ConfigMap:

/config/redis/application.properties
/config/mysql/application.properties

如果你設(shè)置 config/*/,Spring Boot 會(huì)自動(dòng)掃描并合并這兩個(gè)文件中的配置。

注意:

  • 通配符路徑必須以 / 結(jié)尾(如 config/*/
  • 按文件絕對(duì)路徑字母排序加載
  • 適用于目錄,不適用于單個(gè)文件

SPRING_APPLICATION_JSON:用 JSON 注入配置

你可以通過環(huán)境變量或系統(tǒng)屬性傳入 JSON 格式的配置:

方法一:環(huán)境變量(Unix/Linux)

$ SPRING_APPLICATION_JSON='{"acme":{"name":"test"}}' java -jar myapp.jar

等價(jià)于配置了:

acme.name=test

方法二:JVM 系統(tǒng)屬性

$ java -Dspring.application.json='{"name":"test"}' -jar myapp.jar

方法三:命令行參數(shù)

$ java -jar myapp.jar --spring.application.json='{"name":"test"}'

方法四:JNDI

java:comp/env/spring.application.json

注意:JSON 中的 null 值不會(huì)覆蓋低優(yōu)先級(jí)的已有配置(視為“缺失”而非“設(shè)為空”)

RandomValuePropertySource:生成隨機(jī)值

用于注入隨機(jī)數(shù),適合測(cè)試或生成密鑰:

my.secret=${random.value}
my.number=${random.int}
my.uuid=${random.uuid}
my.number.less.than.ten=${random.int(10)}        # 0~9
my.number.in.range=${random.int[1024,65536]}     # 1024~65535

命令行參數(shù)處理

默認(rèn)情況下,Spring Boot 會(huì)把 --xxx=yyy 這樣的參數(shù)轉(zhuǎn)為配置項(xiàng)加入 Environment。

例如:

java -jar app.jar --server.port=9000 --debug

等價(jià)于設(shè)置了:

server.port=9000
debug=true

命令行參數(shù)優(yōu)先級(jí)極高,常用于臨時(shí)調(diào)試或 CI/CD 動(dòng)態(tài)配置。

如果你想禁用這個(gè)功能:

SpringApplication app = new SpringApplication(MyApp.class);
app.setAddCommandLineProperties(false); // 禁用命令行參數(shù)解析
app.run(args);

application.properties 的加載位置

Spring Boot 會(huì)在以下位置查找 application.properties(按優(yōu)先級(jí)從高到低):

  1. file:./config/ (當(dāng)前項(xiàng)目根目錄下的 config 文件夾)
  2. file:./ (當(dāng)前項(xiàng)目根目錄)
  3. classpath:/config/ (類路徑下的 config 包)
  4. classpath:/ (類路徑根目錄)

越靠近項(xiàng)目的外部配置,優(yōu)先級(jí)越高。

你可以自定義配置文件名:

java -jar myapp.jar --spring.config.name=myproject
# 會(huì)去加載 myproject.properties 而不是 application.properties

也可以指定配置文件路徑:

java -jar myapp.jar --spring.config.location=classpath:/default.properties,classpath:/override.properties

spring.config.location vs spring.config.additional-location

參數(shù)行為示例
spring.config.location替換默認(rèn)位置--spring.config.location=custom/ → 只加載 custom/ 目錄
spring.config.additional-location追加額外位置(先加載)--spring.config.additional-location=custom/ → 先加載 custom/,再加載默認(rèn)位置

使用 additional-location 可以實(shí)現(xiàn)“默認(rèn)配置 + 局部覆蓋”的模式。

Profile-specific Properties(環(huán)境特定配置)

命名規(guī)則:application-{profile}.propertiesapplication-{profile}.yml

比如:

  • application-dev.properties
  • application-prod.yml

加載邏輯:

  • 如果激活了 dev 環(huán)境,則加載 application-dev.properties
  • Profile-specific 文件總是覆蓋普通文件
  • 多個(gè) profile 激活時(shí),后激活的優(yōu)先級(jí)更高(last-wins)

可以通過以下方式激活 profile:

--spring.profiles.active=dev,mysql

或者在 application.properties 中設(shè)置:

spring.profiles.active=dev

注意:

  • 如果你用了 spring.config.location 指定了具體文件,不會(huì)自動(dòng)加載 profile 變體
  • 推薦使用目錄形式,如 config/*/ 來支持 profile 文件

占位符(Placeholders)支持

可以在 .properties 文件中引用其他已定義的屬性:

app.name=MyApp
app.description=${app.name} is a Spring Boot application

結(jié)果:app.description = MyApp is a Spring Boot application

這在簡(jiǎn)化長(zhǎng)配置時(shí)很有用。

加密屬性(Encrypting Properties)

Spring Boot 本身不提供加密功能

但你可以通過實(shí)現(xiàn) EnvironmentPostProcessor 接口,在應(yīng)用啟動(dòng)前修改 Environment 中的屬性值,從而實(shí)現(xiàn)解密。

例如:

  • 讀取加密的數(shù)據(jù)庫(kù)密碼
  • EnvironmentPostProcessor 中調(diào)用解密算法
  • 替換原始值為明文

推薦方案:
使用 Spring Cloud VaultHashiCorp Vault 來集中管理敏感配置。

使用 YAML 替代 Properties

YAML 是 JSON 的超集,更適合表達(dá)層級(jí)結(jié)構(gòu)。

示例:

environments:
  dev:
    url: https://dev.example.com
    name: Developer Setup
  prod:
    url: https://prod.example.com
    name: Production

等價(jià)于:

environments.dev.url=https://dev.example.com
environments.dev.name=Developer Setup
environments.prod.url=https://prod.example.com
environments.prod.name=Production

列表寫法:

my:
  servers:
    - dev.example.com
    - prod.example.com

轉(zhuǎn)換為:

my.servers[0]=dev.example.com
my.servers[1]=prod.example.com

要綁定到 Java 對(duì)象,需定義 List<String> 類型:

@ConfigurationProperties("my")
public class MyConfig {
    private List<String> servers = new ArrayList<>();
    // getter/setter
}

多 Profile 的 YAML 寫法(--- 分隔)

YAML 支持在一個(gè)文件中寫多個(gè) profile 的配置:

server:
  address: 192.168.1.100

---
spring:
  profiles: development
server:
  address: 127.0.0.1

---
spring:
  profiles: production & eu-central
server:
  address: 192.168.1.120
  • --- 分隔不同文檔
  • 每個(gè)文檔可以用 spring.profiles 指定適用環(huán)境
  • 支持表達(dá)式:production & (eu-central | eu-west)
  • 支持取反:!test 表示“非 test 環(huán)境”

注意:不要混用 profile-specific 文件(如 application-dev.yml)和多文檔 YAML,否則嵌套文檔可能被忽略。

YAML 的局限性

  1. 不能用 @PropertySource 注解加載 YAML 文件
    • 所以如果你必須用 @PropertySource,就只能用 .properties 文件
  2. 在 profile-specific 的 YAML 文件中使用 --- 多文檔語(yǔ)法可能導(dǎo)致意外行為
    • 因?yàn)槲募旧硪呀?jīng)是 profile-specific,內(nèi)部的 spring.profiles 可能被忽略

建議:要么全用多文檔 YAML,要么全用 profile-specific 文件,不要混用

總結(jié):核心要點(diǎn)一覽

主題關(guān)鍵結(jié)論
配置來源properties、yaml、環(huán)境變量、命令行、JSON、JNDI 等
優(yōu)先級(jí)順序命令行 > 環(huán)境變量 > 外部文件 > 內(nèi)部文件 > 默認(rèn)值
Profile 配置application-{profile}.xxx,優(yōu)先級(jí)高于普通配置
YAML vs PropertiesYAML 更適合復(fù)雜結(jié)構(gòu),Properties 更通用
通配符路徑config/*/ 可用于 Kubernetes 多 ConfigMap 場(chǎng)景
調(diào)試工具/actuator/env 查看所有配置來源
隨機(jī)值${random.int}, ${random.uuid}
占位符${app.name} 引用其他屬性
加密需自行實(shí)現(xiàn) EnvironmentPostProcessor 或用 Vault
最佳實(shí)踐外部配置 + profile + YAML + 命令行參數(shù)組合使用

實(shí)際開發(fā)建議

  1. 本地開發(fā):用 application-dev.properties + IDE 運(yùn)行參數(shù)
  2. 測(cè)試環(huán)境:CI/CD 中通過 --spring.profiles.active=test 激活
  3. 生產(chǎn)環(huán)境
    • 使用 --spring.config.location=file:/etc/myapp/config/ 指向外置目錄
    • 敏感信息通過 SPRING_APPLICATION_JSON 或 Vault 注入
    • --spring.profiles.active=prod 激活生產(chǎn)配置
  4. K8s 部署
    • 用 ConfigMap 掛載多個(gè) YAML 文件到 config/*/
    • 使用 spring.config.location=config/*/ 自動(dòng)合并

以上就是SpringBoot外部化配置的最佳實(shí)踐指南的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot外部化配置的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Spring延遲Bean初始化的實(shí)現(xiàn)示例

    Spring延遲Bean初始化的實(shí)現(xiàn)示例

    延遲初始化也叫做惰性初始化,指不提前初始化Bean,而是只有在真正使用時(shí)才創(chuàng)建及初始化Bean,本文主要介紹了Spring延遲Bean初始化的實(shí)現(xiàn)示例,感興趣的可以了解一下
    2024-06-06
  • 面試初級(jí)Java開發(fā)問到Arrays

    面試初級(jí)Java開發(fā)問到Arrays

    這篇文章主要介紹了Java Arrays工具類用法,結(jié)合實(shí)例形式分析了java Arrays工具類針對(duì)數(shù)組元素修改、復(fù)制、排序等操作使用技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2021-07-07
  • Mybatis-Plus中使用@DS注解動(dòng)態(tài)選擇數(shù)據(jù)源的源碼解讀

    Mybatis-Plus中使用@DS注解動(dòng)態(tài)選擇數(shù)據(jù)源的源碼解讀

    這篇文章主要介紹了Mybatis-Plus中使用@DS注解動(dòng)態(tài)選擇數(shù)據(jù)源的源碼解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • java使用webuploader實(shí)現(xiàn)跨域上傳詳解

    java使用webuploader實(shí)現(xiàn)跨域上傳詳解

    目前初步接觸JAVA圖片上傳,用的webuploader。已經(jīng)跟后臺(tái)對(duì)接上,但是有個(gè)問題就是跨域請(qǐng)求,通過查找相關(guān)資料終于實(shí)現(xiàn)了,下面這篇文章主要給大家介紹了關(guān)于java使用webuploader實(shí)現(xiàn)跨域上傳的相關(guān)資料,需要的朋友可以參考下。
    2017-07-07
  • java根據(jù)模板實(shí)現(xiàn)填充word內(nèi)容并轉(zhuǎn)換為pdf

    java根據(jù)模板實(shí)現(xiàn)填充word內(nèi)容并轉(zhuǎn)換為pdf

    這篇文章主要為大家詳細(xì)介紹了java如何根據(jù)模板實(shí)現(xiàn)填充word內(nèi)容并轉(zhuǎn)換為pdf,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-04-04
  • Maven中exec插件執(zhí)行Java程序的實(shí)現(xiàn)

    Maven中exec插件執(zhí)行Java程序的實(shí)現(xiàn)

    在Maven項(xiàng)目中,可以使用Maven的插件來執(zhí)行Java程序,本文主要介紹了Maven中exec插件執(zhí)行Java程序的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-12-12
  • Zookeeper全局唯一ID生成方案解析

    Zookeeper全局唯一ID生成方案解析

    這篇文章主要介紹了Zookeeper全局唯一ID生成方案解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-12-12
  • springboot定時(shí)任務(wù)備份mysql數(shù)據(jù)庫(kù)的實(shí)現(xiàn)示例

    springboot定時(shí)任務(wù)備份mysql數(shù)據(jù)庫(kù)的實(shí)現(xiàn)示例

    為了防止數(shù)據(jù)庫(kù)被清庫(kù)或者誤刪數(shù)據(jù)庫(kù)的情況,所以需要定時(shí)將mysql數(shù)據(jù)庫(kù)中的數(shù)據(jù)進(jìn)行備份,本文主要介紹了springboot定時(shí)任務(wù)備份mysql數(shù)據(jù)庫(kù)的實(shí)現(xiàn)示例,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-03-03
  • 全面了解Java中Native關(guān)鍵字的作用

    全面了解Java中Native關(guān)鍵字的作用

    下面小編就為大家?guī)硪黄媪私釰ava中Native關(guān)鍵字的作用。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-07-07
  • 小項(xiàng)目改造快速引入 mybatis的流程分析

    小項(xiàng)目改造快速引入 mybatis的流程分析

    這篇文章主要介紹了小項(xiàng)目改造快速引入 mybatis,功能方面非常簡(jiǎn)單,考慮到開發(fā)速度,直接按 springboot 項(xiàng)目進(jìn)行開發(fā),依賴方面僅僅使用 spring-boot-starter-web, spring-boot-starter-jdbc, sqljdbc4, lombook,需要的朋友可以參考下
    2022-05-05

最新評(píng)論

平武县| 南丹县| 阳东县| 徐闻县| 台南市| 宜宾市| 山西省| 福海县| 台安县| 炉霍县| 牙克石市| 务川| 安岳县| 普兰县| 特克斯县| 阿城市| 六安市| 潢川县| 永德县| 黄骅市| 四子王旗| 龙山县| 雷山县| 白水县| 阿图什市| 保靖县| 故城县| 南郑县| 寿光市| 台州市| 财经| 景谷| 化隆| 建阳市| 牙克石市| 浦县| 高密市| 大足县| 嘉善县| 来宾市| 册亨县|