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

SpringBoot讀取配置優(yōu)先級順序的方法詳解

 更新時間:2024年05月10日 09:13:40   作者:碼農Academy  
Spring Boot作為一種輕量級的Java應用程序框架,以其開箱即用、快速搭建新項目的特性贏得了廣大開發(fā)者的青睞,在Spring Boot生態(tài)系統(tǒng)中,配置屬性可以從各種來源獲取,本文將深入探討Spring Boot加載外部配置屬性的優(yōu)先級規(guī)則,需要的朋友可以參考下

引言

Spring Boot作為一種輕量級的Java應用程序框架,以其開箱即用、快速搭建新項目的特性贏得了廣大開發(fā)者的青睞。其核心理念之一就是簡化配置過程,使開發(fā)者能夠快速響應復雜多變的生產環(huán)境需求。為了實現(xiàn)這一點,Spring Boot支持豐富的外部化配置機制,允許應用程序根據(jù)不同的部署環(huán)境靈活加載相應的配置屬性,而無需修改代碼本身。

在Spring Boot生態(tài)系統(tǒng)中,配置屬性可以從各種來源獲取,比如:Java屬性文件、YAML文件、環(huán)境變量、命令行參數(shù)等。這些配置屬性能夠在運行時動態(tài)注入到Bean中,極大地提高了系統(tǒng)的可擴展性和可配置性。然而,為了確保一致性和防止配置沖突,Spring Boot在加載這些外部配置時遵循一套嚴格的優(yōu)先級順序。掌握這套優(yōu)先級規(guī)則至關重要,因為它直接影響著最終生效的配置屬性值,進而決定了應用程序的行為模式。

本文將深入探討Spring Boot加載外部配置屬性的優(yōu)先級規(guī)則,詳盡梳理各個配置源的加載順序,并結合實際應用場景舉例說明,以便我們能夠更高效地管理和遷移配置,確保在不同環(huán)境下應用程序都能穩(wěn)定、準確地運行。

Spring Boot外部化配置概述

Spring Boot的核心價值之一在于其強大的外部化配置能力,這使得應用程序能夠在不改變代碼的情況下適應不同的運行環(huán)境。外部化配置意味著將應用程序的關鍵配置信息移至應用程序代碼之外,便于根據(jù)不同環(huán)境(如開發(fā)、測試、生產等)進行定制化配置。Spring Boot提供了多樣化的外部配置源以及便捷的屬性注入方式,使得這種配置機制變得異常靈活且易于管理。

多樣化配置源

Spring Boot支持多種類型的外部配置源,主要有如下幾個方面:

Properties文件:

通常使用.properties格式,采用鍵值對的形式存儲配置信息。

server.port=8080
logging.level.root=DEBUG

YAML文件:
相較于傳統(tǒng)的properties文件,YAML提供了更直觀、層次更分明的數(shù)據(jù)結構,尤其適合存儲復雜配置。使用.yml格式。

server:
  port: 8080
logging:
  level:
    root: DEBUG

環(huán)境變量
操作系統(tǒng)級別的環(huán)境變量可以被Spring Boot識別并作為配置源,這對于云環(huán)境和容器化部署尤為實用。

命令行參數(shù)
啟動Spring Boot應用時,可以傳入命令行參數(shù)(以--開頭)直接覆蓋已有配置。

屬性注入方式

在Spring Boot中,外部配置的屬性值可以通過以下幾種方式方便地注入到Bean中。

  • @Value注解:可以直接在字段或方法參數(shù)上使用此注解,將配置屬性值注入到目標對象中。
  • Environment接口:Spring框架提供的環(huán)境抽象類,可以用來查詢所有已加載的配置信息。
  • @ConfigurationProperties注解:用于綁定一組相關配置到一個專門的Java Bean中,提供更結構化的配置管理方式。

配置加載優(yōu)先級

Spring Boot對來自不同配置源的同名屬性可以按照一定的優(yōu)先級順序進行覆蓋。其優(yōu)先級從上到下變高,即后面的配置源將覆蓋前面的配置源。

  1. 默認屬性(通過SpringApplication.setDefaultProperties方法設置)
  2. @PropertySource注解加載的配置
  3. Config Data(配置數(shù)據(jù))(本地文件系統(tǒng)或打包在jar中的application.properties和application-{profile}.properties)
  4. 特殊屬性源(如隨機數(shù)生成器、環(huán)境變量、系統(tǒng)屬性、JNDI屬性等)
  5. Servlet容器相關的初始化參數(shù)
  6. SPRING_APPLICATION_JSON格式的環(huán)境變量或系統(tǒng)屬性
  7. 命令行參數(shù)
  8. 測試相關的屬性注入方式(如@SpringBootTest、@DynamicPropertySource@TestPropertySource

以上優(yōu)先級順序來源于官網(wǎng):Spring Boot Reference Documentation

Spring Boot配置加載順序詳解

默認屬性

默認屬性是指Spring Boot框架內置的一些默認配置值??梢栽趧?chuàng)建SpringApplication實例時,通過調用setDefaultProperties(Map<String, Object> defaultProperties)方法來提供一組默認屬性,這些屬性將被優(yōu)先加載,但是也會被其他配置覆蓋。

@SpringBootApplication
public class SpringBootBaseApplication {

	public static void main(String[] args) {
		Map<String, Object> defaultProperties = new HashMap<>();
		defaultProperties.put("server.port", "9000"); // 自定義默認端口
		SpringApplication app = new SpringApplication(SpringBootBaseApplication.class);
		app.setDefaultProperties(defaultProperties);
		app.run(args);
	}
}

image.png

@PropertySource注解

@PropertySource注解用于在Spring Boot的@Configuration類上加載外部屬性文件。當我們在配置類上使用@PropertySource時,需要注意的是,這些屬性源并不會立即被添加到Spring的Environment中。它們是在Spring應用上下文刷新(refresh)階段才會被真正加載并合并到環(huán)境變量中。

有興趣的可以跟一下源碼,org.springframework.context.support.AbstractApplicationContext#invokeBeanFactoryPostProcessors中執(zhí)行的。

Spring Boot的主引導配置,如服務器端口(server.port)、日志框架的初始化(例如日志級別設置)等,也是在應用上下文刷新之前就被讀取并應用的。因此,對于這類早期就需要讀取的配置,應該直接在application.properties或者環(huán)境變量等更早被加載的配置源中進行設置。

我們創(chuàng)建一個propertysource.properties文件:

server.port = 9001
coderacademy.name = CoderAcademy

然后我們在@Configuration配置上使用@PropertySource導入propertysource.properties文件。

@PropertySource(value = "classpath:propertysource.properties")
@Configuration
public class MyConfig {

}

我們在應用啟動后看一下上述配置:

@SpringBootApplication
public class SpringBootBaseApplication {

	public static void main(String[] args) {
		Map<String, Object> defaultProperties = new HashMap<>();
		defaultProperties.put("server.port", "9000"); // 自定義默認端口
		SpringApplication app = new SpringApplication(SpringBootBaseApplication.class);
		app.setDefaultProperties(defaultProperties);
		ConfigurableApplicationContext context = app.run(args);
		Environment environment = context.getEnvironment();
		System.out.println("coderacademy.name: " + environment.getProperty("coderacademy.name"));
	}
}

打印結果:

image.png

可以看出server.port變成了9001,即@PropertySource加載的配置覆蓋了SpringBoot默認的屬性值。

Config Data(配置數(shù)據(jù))

Config Data(配置數(shù)據(jù))是Spring Boot中用于外部化應用配置的核心部分。主要由內部配置文件以及外部配置文件。

內部配置文件

內部配置文件最基礎的應用配置文件,位于項目構建后的jar包內部。位于src/main/resource目錄下的文件。

image.png

外部配置文件

可以將配置文件放在jar包外面的某個路徑下。這種方式有助于在不修改jar包的情況下變更配置。比如我們使用的配置中心(nacosapollo等),也可以通過spring.config.location或者spring.config.additional-location指定的文件等。

SpringBoot在啟動時會默認從特定的目錄中加載這些配置文件。我們可以從ConfigDataEnvironment中找到這些目錄:

image.png

其目錄的加載順序由低到高為:

file:./
file:./config/
file:./config/*/
classpath:/
classpath:/config/

其中file代表應用根目錄下的文件,而classpathresources下的文件。

這些配置文件的配置優(yōu)先級順序由低到高為:

classpath:/
classpath:/config/
file:./
file:./config/
file:./config/*/

本例基于SpringBoot2.7版本。

我們分別在這些目錄下創(chuàng)建配置文件application.properties

我們在對應文件中寫入他們的目錄路徑:

1: config.data.path = classpath:./
2: config.data.path = classpath:./config/
3: config.data.path = file:./
4: config.data.path = file:./config/
5: config.data.path = file:./config/dev

我們在SpringBoot啟動時打印config.data.path的值:

@SpringBootApplication
public class SpringBootConfigApplication {

	public static void main(String[] args) {
		Map<String, Object> defaultProperties = new HashMap<>();
		defaultProperties.put("server.port", "9000"); // 自定義默認端口
		SpringApplication app = new SpringApplication(SpringBootConfigApplication.class);
		app.setDefaultProperties(defaultProperties);
		ConfigurableApplicationContext context = app.run(args);
		Environment environment = context.getEnvironment();
		System.out.println("config.data.path: " + environment.getProperty("config.data.path"));
	}
}

我們分步進行驗證,先驗證1,2,打印結果:

config.data.path: classpath:./config/

繼續(xù)驗證1,2,3,打印結果:

config.data.path: file:./

驗證1,2,3,4,打印結果:

config.data.path: file:./config/

驗證1,2,3,4,5,打印結果:

config.data.path: file:./config/dev

隨機值屬性源

RandomValuePropertySource 在Spring Boot中,RandomValuePropertySource是一個特殊屬性源,它并不來源于固定的配置文件或環(huán)境變量,而是由Spring Boot框架在啟動時自動添加。這個屬性源提供的屬性名以random.*開頭,可以用于生成隨機值。例如,你可以在配置文件中引用random.intrandom.long等屬性,Spring Boot在啟動時會為這些屬性生成隨機整數(shù)值。這對于需要在運行時生成一些臨時或隨機值的場景非常有用,如臨時密碼、緩存密鑰等。

比如我們在application.properties中設置random.int=100

random.int=100

我們在SpringBoot啟動時獲取``random.int`的值:

@SpringBootApplication
public class ConfigApplication
{
    public static void main( String[] args )
    {
        SpringApplication app = new SpringApplication(ConfigApplication.class);
        ConfigurableApplicationContext context = app.run(args);
        Environment environment = context.getEnvironment();
        System.out.println("random.int: " + environment.getProperty("random.int"));
    }
}

打印結果為:

random.int: -510589238

并且每次重新啟動應用,打印的結果都不一樣。

操作系統(tǒng)環(huán)境變量

在Spring Boot中,環(huán)境變量可以用作配置源,Spring Boot會自動檢測并加載這些環(huán)境變量作為應用的配置屬性。例如,如果在操作系統(tǒng)中設置了環(huán)境變量MY_APP_PORT=8080,那么在Spring Boot應用中可以通過${MY_APP_PORT}來引用這個值。

我們設置環(huán)境變量為config.data.path=環(huán)境變量:

image.png

我們啟動引用,依然打印config.data.path的結果為:

config.data.path: 環(huán)境變量

Java系統(tǒng)屬性

Java系統(tǒng)屬性是通過System.setProperty()方法設置一系列鍵值對。

@SpringBootApplication
public class ConfigApplication
{
    static {
        System.setProperty("config.data.path", "SystemProperty"); // 設置系統(tǒng)屬性
    }

    public static void main( String[] args )
    {
        SpringApplication app = new SpringApplication(ConfigApplication.class);
        ConfigurableApplicationContext context = app.run(args);
        Environment environment = context.getEnvironment();
        System.out.println("config.data.path: " + environment.getProperty("config.data.path"));
    }
}

打印結果為:

config.data.path: SystemProperty

SPRING_APPLICATION_JSON環(huán)境變量中的內嵌JSON屬性

SPRING_APPLICATION_JSON 是 Spring Boot 提供的一種機制,允許通過環(huán)境變量傳遞 JSON 格式的配置給應用程序。這個環(huán)境變量的內容會被解析成一個 JSON 對象,并合并到Spring的Environment中,就像其他屬性源一樣。

@SpringBootApplication
public class ConfigApplication
{
    static {
        System.setProperty("config.data.path", "SystemProperty"); // 設置系統(tǒng)屬性
        System.setProperty("SPRING_APPLICATION_JSON", "{\"config.data.path\":\"SPRING_APPLICATION_JSON環(huán)境變量中的內嵌JSON屬性\"}");
    }

    public static void main( String[] args )
    {
        SpringApplication app = new SpringApplication(ConfigApplication.class);
        ConfigurableApplicationContext context = app.run(args);
        Environment environment = context.getEnvironment();
        System.out.println("config.data.path: " + environment.getProperty("config.data.path"));
    }
}

打印結果:

config.data.path: SPRING_APPLICATION_JSON環(huán)境變量中的內嵌JSON屬性

命令行參數(shù)

啟動Spring Boot應用時,可以直接通過命令行參數(shù)來覆蓋或設置配置屬性。命令行參數(shù)通常以--開頭,后面緊跟屬性名和值,如--server.port=8080。這種方式可以在不修改配置文件的前提下臨時調整應用配置。命令行參數(shù)具有較高的優(yōu)先級,可以覆蓋其它配置源中的屬性值。

我們使用java -jar啟動SpringBoot:

java -jar ./springboot-config-1.0-SNAPSHOT.jar --config.data.path=命令行參數(shù)

打印結果為:

config.data.path: 命令行參數(shù)

關于SpringBoot的jar包,可以通過java -jar命令直接執(zhí)行的原因請參考:字節(jié)二面:為什么SpringBoot的 jar 可以直接運行?我說內嵌了Tomcat容器,他讓我出門左轉

至于其他的跟單測有關的配置,我們就不一一細說了

總結

Spring Boot配置加載優(yōu)先級的設計具有深遠的實際意義和重要性。這一機制確保了應用在不同環(huán)境和部署場景下的高度靈活性和可移植性,同時也極大提升了開發(fā)和運維團隊的生產力和協(xié)同效率。

優(yōu)先級順序的嚴謹性使得開發(fā)者能夠精細地控制配置的覆蓋層級,從而使同一份代碼可以根據(jù)不同環(huán)境的需求加載不同的配置屬性。例如,在開發(fā)、測試和生產環(huán)境中分別啟用不同的數(shù)據(jù)庫連接、日志級別或API密鑰等敏感信息,而無需在代碼中硬編碼。

Spring Boot的配置加載流程首先考慮了默認配置,然后逐步加載用戶通過@PropertySource注解引入的屬性源、打包在jar包內外的各種application.properties和application-{profile}.properties或YAML文件、環(huán)境變量、系統(tǒng)屬性,直至命令行參數(shù)等。這種分層加載策略確保了越靠后的配置源擁有更高的優(yōu)先級,從而可以覆蓋之前的配置,這也體現(xiàn)了配置的靈活性和即時性。

理解并合理運用Spring Boot配置加載的優(yōu)先級,對于保障應用的安全性、可維護性以及降低部署復雜度至關重要。特別是在大規(guī)模微服務架構中,合理的配置管理和遷移對于整體系統(tǒng)的穩(wěn)定性有著不可忽視的作用。通過對配置優(yōu)先級的深入掌控,開發(fā)者和運維人員能夠輕松應對復雜環(huán)境下的配置管理挑戰(zhàn),使得Spring Boot應用具備良好的擴展性和適應性。

以上就是SpringBoot讀取配置優(yōu)先級順序的方法詳解的詳細內容,更多關于SpringBoot優(yōu)先級順序的資料請關注腳本之家其它相關文章!

相關文章

  • SpringBoot使用Maven打包后運行失敗的問題解決詳解

    SpringBoot使用Maven打包后運行失敗的問題解決詳解

    在使用 Spring Boot 開發(fā)項目時,我們通常會使用 Maven 作為構建工具,但有時會出現(xiàn)運行失敗的情況,本文將從多個角度分析常見錯誤場景,并提供詳細的排查和解決方案,希望對大家有所幫助
    2025-07-07
  • Java實現(xiàn)Excel數(shù)據(jù)驗證功能

    Java實現(xiàn)Excel數(shù)據(jù)驗證功能

    在Java中,開發(fā)者可以使用一些開源的庫(如Apache POI)來添加、修改和處理Excel中的數(shù)據(jù),下面我們就來看看如何使用Java實現(xiàn)添加,修改和刪除Excel數(shù)據(jù)驗證吧
    2023-10-10
  • Java使用SLF4J記錄不同級別日志的示例詳解

    Java使用SLF4J記錄不同級別日志的示例詳解

    SLF4J是一個簡單的日志門面,它允許在運行時選擇不同的日志實現(xiàn),這篇文章主要為大家詳細介紹了如何使用SLF4J記錄不同級別日志,感興趣的可以了解下
    2025-04-04
  • Java有效處理異常的三個原則

    Java有效處理異常的三個原則

    Java中異常提供了一種識別及響應錯誤情況的一致性機制,有效地異常處理能使程序更加健壯、易于調試。那么這篇文章總結了Java有效處理異常的三個原則,有需要的朋友們可以參考借鑒。
    2016-09-09
  • Project?Reactor?響應式范式編程

    Project?Reactor?響應式范式編程

    這篇文章主要為大家介紹了Project?Reactor?響應式范式編程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04
  • 基于Java實現(xiàn)對文件進行MD5加密

    基于Java實現(xiàn)對文件進行MD5加密

    MD5(Message-Digest?Algorithm?5)是一種廣泛使用的哈希函數(shù),可以生成一個128位(16字節(jié))的哈希值,本文將介紹如何使用Java語言實現(xiàn)對文件的MD5加密,幫助開發(fā)者理解和應用這一技術
    2025-06-06
  • SpringBoot+Swagger打造美觀API文檔的實戰(zhàn)指南

    SpringBoot+Swagger打造美觀API文檔的實戰(zhàn)指南

    在現(xiàn)代 Web 開發(fā)中,API 文檔是開發(fā)者和團隊協(xié)作的重要組成部分,本文將詳細介紹如何在 SpringBoot2和SpringBoot3中集成Swagger,并展示多種接口文檔風格,幫助開發(fā)者選擇適合自己項目的展示方式
    2025-08-08
  • RestTemplate自定義請求失敗異常處理示例解析

    RestTemplate自定義請求失敗異常處理示例解析

    這篇文章主要為大家介紹了RestTemplate自定義請求失敗異常處理的示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪
    2022-03-03
  • 淺談Spring Boot中如何干掉if else的方法

    淺談Spring Boot中如何干掉if else的方法

    這篇文章主要介紹了Spring Boot中如何干掉if else的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-09-09
  • 教你如何用好 Java 中的枚舉

    教你如何用好 Java 中的枚舉

    在本文中,我們將看到什么是 Java 枚舉,它們解決了哪些問題以及如何在實踐中使用 Java 枚舉實現(xiàn)一些設計模式。下面小編將為大家詳細介紹
    2021-09-09

最新評論

渭源县| 化州市| 荔浦县| 忻州市| 务川| 德江县| 阿拉尔市| 友谊县| 云阳县| 大埔区| 富阳市| 双桥区| 宝鸡市| 城固县| 滦平县| 黑山县| 南昌市| 新源县| 区。| 康保县| 太仆寺旗| 麻城市| 铜鼓县| 克拉玛依市| 普兰县| 定结县| 兴仁县| 肇源县| 石渠县| 黔东| 顺昌县| 北票市| 临夏县| 定襄县| 泰安市| 白水县| 沙河市| 昌图县| 红安县| 临邑县| 广元市|