日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

美團二面:SpringBoot讀取配置優先級順序是什么?

來源: 責編: 時間:2024-04-15 18:14:40 247觀看
導讀引言Spring Boot作為一種輕量級的Java應用程序框架,以其開箱即用、快速搭建新項目的特性贏得了廣大開發者的青睞。其核心理念之一就是簡化配置過程,使開發者能夠快速響應復雜多變的生產環境需求。為了實現這一點,Spring

引言

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

在Spring Boot生態系統中,配置屬性可以從各種來源獲取,比如:Java屬性文件、YAML文件、環境變量、命令行參數等。這些配置屬性能夠在運行時動態注入到Bean中,極大地提高了系統的可擴展性和可配置性。然而,為了確保一致性和防止配置沖突,Spring Boot在加載這些外部配置時遵循一套嚴格的優先級順序。掌握這套優先級規則至關重要,因為它直接影響著最終生效的配置屬性值,進而決定了應用程序的行為模式。WsW28資訊網——每日最新資訊28at.com

本文將深入探討Spring Boot加載外部配置屬性的優先級規則,詳盡梳理各個配置源的加載順序,并結合實際應用場景舉例說明,以便我們能夠更高效地管理和遷移配置,確保在不同環境下應用程序都能穩定、準確地運行。WsW28資訊網——每日最新資訊28at.com

Spring Boot外部化配置概述

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

多樣化配置源

Spring Boot支持多種類型的外部配置源,主要有如下幾個方面:WsW28資訊網——每日最新資訊28at.com

Properties文件: 通常使用.properties格式,采用鍵值對的形式存儲配置信息。WsW28資訊網——每日最新資訊28at.com

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

YAML文件: 相較于傳統的properties文件,YAML提供了更直觀、層次更分明的數據結構,尤其適合存儲復雜配置。使用.yml格式。WsW28資訊網——每日最新資訊28at.com

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

1. 環境變量: 操作系統級別的環境變量可以被Spring Boot識別并作為配置源,這對于云環境和容器化部署尤為實用。WsW28資訊網——每日最新資訊28at.com

2. 命令行參數: 啟動Spring Boot應用時,可以傳入命令行參數(以--開頭)直接覆蓋已有配置。WsW28資訊網——每日最新資訊28at.com

屬性注入方式

在Spring Boot中,外部配置的屬性值可以通過以下幾種方式方便地注入到Bean中。WsW28資訊網——每日最新資訊28at.com

? @Value注解:可以直接在字段或方法參數上使用此注解,將配置屬性值注入到目標對象中。WsW28資訊網——每日最新資訊28at.com

? Environment接口:Spring框架提供的環境抽象類,可以用來查詢所有已加載的配置信息。WsW28資訊網——每日最新資訊28at.com

? @ConfigurationProperties注解:用于綁定一組相關配置到一個專門的Java Bean中,提供更結構化的配置管理方式。WsW28資訊網——每日最新資訊28at.com

配置加載優先級

Spring Boot對來自不同配置源的同名屬性可以按照一定的優先級順序進行覆蓋。其優先級從上到下變高,即后面的配置源將覆蓋前面的配置源。WsW28資訊網——每日最新資訊28at.com

1. 默認屬性(通過SpringApplication.setDefaultProperties方法設置)WsW28資訊網——每日最新資訊28at.com

2. @PropertySource注解加載的配置WsW28資訊網——每日最新資訊28at.com

3. Config Data(配置數據)(本地文件系統或打包在jar中的application.properties和application-{profile}.properties)WsW28資訊網——每日最新資訊28at.com

4. 特殊屬性源(如隨機數生成器、環境變量、系統屬性、JNDI屬性等)WsW28資訊網——每日最新資訊28at.com

5. Servlet容器相關的初始化參數WsW28資訊網——每日最新資訊28at.com

6. SPRING_APPLICATION_JSON格式的環境變量或系統屬性WsW28資訊網——每日最新資訊28at.com

7. 命令行參數WsW28資訊網——每日最新資訊28at.com

8. 測試相關的屬性注入方式(如@SpringBootTest、@DynamicPropertySource和@TestPropertySource)WsW28資訊網——每日最新資訊28at.com

以上優先級順序來源于官網:Spring Boot Reference DocumentationWsW28資訊網——每日最新資訊28at.com

Spring Boot配置加載順序詳解

默認屬性

默認屬性是指Spring Boot框架內置的一些默認配置值。可以在創建SpringApplication實例時,通過調用setDefaultProperties(Map<String, Object> defaultProperties)方法來提供一組默認屬性,這些屬性將被優先加載,但是也會被其他配置覆蓋。WsW28資訊網——每日最新資訊28at.com

@SpringBootApplicationpublic 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);    }}

圖片圖片WsW28資訊網——每日最新資訊28at.com

@PropertySource注解

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

有興趣的可以跟一下源碼,org.springframework.context.support.AbstractApplicationContext#invokeBeanFactoryPostProcessors中執行的。WsW28資訊網——每日最新資訊28at.com

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

我們創建一個propertysource.properties文件:WsW28資訊網——每日最新資訊28at.com

server.port = 9001coderacademy.name = CoderAcademy

然后我們在@Configuration配置上使用@PropertySource導入propertysource.properties文件。WsW28資訊網——每日最新資訊28at.com

@PropertySource(value = "classpath:propertysource.properties")@Configurationpublic class MyConfig {}

我們在應用啟動后看一下上述配置:WsW28資訊網——每日最新資訊28at.com

@SpringBootApplicationpublic 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"));    }}

打印結果:WsW28資訊網——每日最新資訊28at.com

可以看出server.port變成了9001,即@PropertySource加載的配置覆蓋了SpringBoot默認的屬性值。WsW28資訊網——每日最新資訊28at.com

Config Data(配置數據)

Config Data(配置數據)是Spring Boot中用于外部化應用配置的核心部分。主要由內部配置文件以及外部配置文件。WsW28資訊網——每日最新資訊28at.com

內部配置文件

內部配置文件最基礎的應用配置文件,位于項目構建后的jar包內部。位于src/main/resource目錄下的文件。WsW28資訊網——每日最新資訊28at.com

外部配置文件

可以將配置文件放在jar包外面的某個路徑下。這種方式有助于在不修改jar包的情況下變更配置。比如我們使用的配置中心(nacos,apollo等),也可以通過spring.config.location或者spring.config.additional-location指定的文件等。WsW28資訊網——每日最新資訊28at.com

SpringBoot在啟動時會默認從特定的目錄中加載這些配置文件。我們可以從ConfigDataEnvironment中找到這些目錄:WsW28資訊網——每日最新資訊28at.com

其目錄的加載順序由低到高為:WsW28資訊網——每日最新資訊28at.com

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

其中file代表應用根目錄下的文件,而classpath為resources下的文件。WsW28資訊網——每日最新資訊28at.com

這些配置文件的配置優先級順序由低到高為:WsW28資訊網——每日最新資訊28at.com

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

本例基于SpringBoot2.7版本。 關于SpringBoot加載內部配置文件的執行流程以及原理,請參考: 華為二面:SpringBoot讀取_配置文件_的原理是什么?加載順序是什么?WsW28資訊網——每日最新資訊28at.com

我們分別在這些目錄下創建配置文件application.properties:WsW28資訊網——每日最新資訊28at.com

我們在對應文件中寫入他們的目錄路徑:WsW28資訊網——每日最新資訊28at.com

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的值:WsW28資訊網——每日最新資訊28at.com

@SpringBootApplicationpublic 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,打印結果:WsW28資訊網——每日最新資訊28at.com

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

繼續驗證1,2,3,打印結果:WsW28資訊網——每日最新資訊28at.com

config.data.path: file:./

驗證1,2,3,4,打印結果:WsW28資訊網——每日最新資訊28at.com

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

驗證1,2,3,4,5,打印結果:WsW28資訊網——每日最新資訊28at.com

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

隨機值屬性源

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

比如我們在application.properties中設置random.int=100WsW28資訊網——每日最新資訊28at.com

random.int=100

我們在SpringBoot啟動時獲取``random.int`的值:WsW28資訊網——每日最新資訊28at.com

@SpringBootApplicationpublic 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"));    }}

打印結果為:WsW28資訊網——每日最新資訊28at.com

random.int: -510589238

并且每次重新啟動應用,打印的結果都不一樣。WsW28資訊網——每日最新資訊28at.com

操作系統環境變量

在Spring Boot中,環境變量可以用作配置源,Spring Boot會自動檢測并加載這些環境變量作為應用的配置屬性。例如,如果在操作系統中設置了環境變量MY_APP_PORT=8080,那么在Spring Boot應用中可以通過${MY_APP_PORT}來引用這個值。WsW28資訊網——每日最新資訊28at.com

我們設置環境變量為config.data.path=環境變量:WsW28資訊網——每日最新資訊28at.com

我們啟動引用,依然打印config.data.path的結果為:WsW28資訊網——每日最新資訊28at.com

config.data.path: 環境變量

Java系統屬性

Java系統屬性是通過System.setProperty()方法設置一系列鍵值對。WsW28資訊網——每日最新資訊28at.com

@SpringBootApplicationpublic class ConfigApplication{    static {        System.setProperty("config.data.path", "SystemProperty"); // 設置系統屬性    }    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"));    }}

打印結果為:WsW28資訊網——每日最新資訊28at.com

config.data.path: SystemProperty

SPRING_APPLICATION_JSON環境變量中的內嵌JSON屬性

SPRING_APPLICATION_JSON 是 Spring Boot 提供的一種機制,允許通過環境變量傳遞 JSON 格式的配置給應用程序。這個環境變量的內容會被解析成一個 JSON 對象,并合并到Spring的Environment中,就像其他屬性源一樣。WsW28資訊網——每日最新資訊28at.com

@SpringBootApplicationpublic class ConfigApplication{    static {        System.setProperty("config.data.path", "SystemProperty"); // 設置系統屬性        System.setProperty("SPRING_APPLICATION_JSON", "{/"config.data.path/":/"SPRING_APPLICATION_JSON環境變量中的內嵌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"));    }}

打印結果:WsW28資訊網——每日最新資訊28at.com

config.data.path: SPRING_APPLICATION_JSON環境變量中的內嵌JSON屬性

命令行參數

啟動Spring Boot應用時,可以直接通過命令行參數來覆蓋或設置配置屬性。命令行參數通常以--開頭,后面緊跟屬性名和值,如--server.port=8080。這種方式可以在不修改配置文件的前提下臨時調整應用配置。命令行參數具有較高的優先級,可以覆蓋其它配置源中的屬性值。WsW28資訊網——每日最新資訊28at.com

我們使用java -jar啟動SpringBoot:WsW28資訊網——每日最新資訊28at.com

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

打印結果為:WsW28資訊網——每日最新資訊28at.com

config.data.path: 命令行參數

WsW28資訊網——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-83627-0.html美團二面:SpringBoot讀取配置優先級順序是什么?

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: Go 如何緩解來自軟件依賴的惡意攻擊?

下一篇: 81道SSM經典面試題總結

標簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
一区二区三区国产在线观看| 国产精品一区在线观看| 久久久久久色| 看片网站欧美日韩| 欧美电影在线免费观看网站| 欧美日韩另类在线| 国产精品入口尤物| 国产在线国偷精品产拍免费yy| 在线免费一区三区| 亚洲欧美三级在线| 午夜视频一区在线观看| 亚洲在线日韩| 久久不射2019中文字幕| 欧美日韩伦理在线免费| 亚洲夜间福利| 伊人成人在线| 欧美尤物一区| 欧美三日本三级少妇三2023| 一区二区三区三区在线| 久久男人av资源网站| 国产乱码精品一区二区三区忘忧草 | 很黄很黄激情成人| 欧美va天堂va视频va在线| 在线精品一区二区| 久久精品一区四区| 欧美日韩国产精品自在自线| 国产一区二区三区久久 | 欧美性事免费在线观看| 一本大道久久a久久精二百| 国产精品久久9| 免播放器亚洲一区| 午夜精品久久| 亚洲一区二区三区久久| 国内伊人久久久久久网站视频| 欧美精品一区在线发布| 欧美成人精品1314www| 韩日欧美一区二区| 国产日韩欧美在线播放不卡| 亚洲国产经典视频| 性欧美8khd高清极品| 欧美日本不卡| 激情六月婷婷久久| 午夜精品美女久久久久av福利| 欧美激情一级片一区二区| 国产亚洲综合精品| 亚洲一区二三| 欧美精品激情| 伊人久久婷婷色综合98网| 亚洲欧美日韩一区二区在线 | 欧美精品久久一区二区| 国模 一区 二区 三区| 亚洲婷婷国产精品电影人久久 | 国产一区二区三区久久久| 亚洲一级黄色片| 欧美精品三级日韩久久| 在线精品国产欧美| 久久国产66| 国产精品私人影院| 在线亚洲欧美视频| 欧美国产视频日韩| 在线观看日韩www视频免费| 欧美一区二区三区视频| 国产精品高清网站| 亚洲视频第一页| 欧美日韩1区| 亚洲精品影院在线观看| 麻豆国产va免费精品高清在线| 国产一区二区久久| 欧美一区二区三区精品电影| 国产精品羞羞答答| 欧美三级乱人伦电影| 亚洲人在线视频| 欧美成人首页| 亚洲成人在线免费| 久久手机精品视频| 黄色综合网站| 久久亚洲国产精品日日av夜夜| 国产专区欧美精品| 久久不射网站| 好吊色欧美一区二区三区四区| 久久精品免费| 黑人一区二区| 久久久久久网| 在线成人中文字幕| 美日韩免费视频| 91久久久久久| 欧美日韩不卡视频| 在线一区亚洲| 国产精品毛片一区二区三区| 亚洲欧美国产精品va在线观看| 国产精品免费一区二区三区观看 | 欧美日韩www| 亚洲一区精品电影| 国产美女精品视频| 欧美在线一二三| 国内精品美女av在线播放| 久久久久久9999| 尤妮丝一区二区裸体视频| 欧美二区在线看| 日韩亚洲一区二区| 国产精品都在这里| 欧美一区二区三区久久精品| 国产资源精品在线观看| 蜜桃精品久久久久久久免费影院| 亚洲国产成人tv| 欧美日韩99| 欧美一区在线视频| 在线观看视频一区| 欧美精品v国产精品v日韩精品| 一区二区三区久久网| 国产精品一区二区久久| 久久精品系列| 亚洲精选在线| 国产精品一区二区三区四区| 欧美一区二区三区免费观看视频| 韩国一区电影| 欧美精品一区二区在线播放| 亚洲在线成人| 极品尤物av久久免费看| 欧美韩国一区| 亚洲自拍偷拍一区| 黄色一区二区在线观看| 欧美日本三区| 欧美在线视频二区| 亚洲欧洲一区二区三区久久| 国产精品麻豆成人av电影艾秋| 欧美在线观看网站| 亚洲精品中文字| 国产农村妇女毛片精品久久莱园子| 久久免费精品日本久久中文字幕| 亚洲精品久久久久久久久久久久久| 国产精品成人午夜| 久久亚洲国产精品日日av夜夜| 9国产精品视频| 国语自产精品视频在线看8查询8| 欧美激情综合五月色丁香小说| 亚洲尤物在线视频观看| 在线精品国产成人综合| 国产精品成av人在线视午夜片| 久久久噜久噜久久综合| 一区二区三区回区在观看免费视频| 狠狠色狠狠色综合| 欧美性事在线| 欧美国产日本韩| 欧美一区2区三区4区公司二百| 亚洲精品久久久蜜桃| 国产手机视频精品| 欧美日韩精品一区二区| 久久久久免费视频| 亚洲一级片在线观看| 亚洲国产成人在线视频| 国产精品夜夜夜| 欧美连裤袜在线视频| 久久久久久久激情视频| 亚洲欧美另类久久久精品2019| 91久久精品美女高潮| 国产一区二区高清| 国产精品久久久久久久浪潮网站| 欧美大胆人体视频| 久久久久久久久久久久久9999 | 性亚洲最疯狂xxxx高清| 99香蕉国产精品偷在线观看| 影音先锋亚洲一区| 国产精品一区二区视频| 欧美日韩国产色综合一二三四 | 国产自产在线视频一区 | 亚洲精选一区二区| 亚洲国产第一| 狠狠色综合日日| 国产美女精品免费电影| 欧美性生交xxxxx久久久| 女女同性精品视频| 久久久成人网| 欧美一级大片在线观看| 在线亚洲激情| 亚洲巨乳在线| 亚洲欧洲一区二区三区在线观看| 狠狠色狠狠色综合日日五| 国产欧美日韩一区| 国产精品久久影院| 欧美色图天堂网| 欧美日韩不卡视频| 欧美韩日一区二区三区| 蜜桃av一区二区三区| 麻豆精品一区二区综合av| 久久久久久久久久久一区| 欧美在线免费播放| 午夜免费久久久久| 亚洲欧美国产日韩中文字幕| 亚洲午夜久久久久久久久电影院| 一本色道久久88综合亚洲精品ⅰ | 另类天堂av| 久热精品视频| 老司机免费视频一区二区| 久久精品30| 久久久国产亚洲精品| 久久久久久午夜| 久久米奇亚洲| 老牛影视一区二区三区| 久久综合伊人77777| 免费亚洲电影| 欧美激情1区| 欧美日韩国产精品专区| 欧美色道久久88综合亚洲精品|