導航:首頁 > 文件管理 > springboot載入配置文件屬性

springboot載入配置文件屬性

發布時間:2023-02-17 18:08:04

1. springboot配置文件讀取

springboot支持多種配置文件讀取方式,了解這些方式有助於查詢和定位問題以及選擇合適的方式進行開發。

springboot默認的配置文件是application.properties,其存放的位置可以有以下幾種,從上到下按照優先順序排序如下,注意,當存在重復的配置文件時,高優先順序的的將會覆蓋低優先順序的。

若不想使用默認的application.properties配置文件,也可以自定義配置文件名,有兩種方式:

這里可以一次性將所有的配置全部載入進入配置文件,然後在使用到的類中注入Configuration 實例,使用get方法獲取屬性。

在實際工作中,需要根據開發、測試和生產配置不同環境的配置文件。可以在合適的路徑下(見第一節配置文件位置)存放 application-dev.properties,application-test.properties,application-prod.properties 三個配置文件分別代表三個不同的環境,在springboot應用啟動時傳入指定的參數,例如 --spring.profiles.active=prod 指定使用 application-prod.properties 文件,另外也可以採用將 spring.profiles.active=prod 配置到系統環境變數中,使用 --spring.config.location=../config/application-{spring.profiles.active}.properties ,springboot還支持載入多個不同的配置文件,例如
--spring.profiles.active=prod,test

2. 單體Spring boot引入外部配置文件yml,properties

我們在做微服務項目時候會引入spring cloud框架,對於配置文件我們就會通過spring cloud config來配置,實現線上環境動態修改配置文件屬性而不需要重新打jar 包。 但是對於單體的spring boot工程,我們又希望可以在生產環境中方案修改配置文件屬性。

通過引入外部配置文件,應用啟動時候設置配置文件的自動載入
1: 在單體工程的root目錄下添加一個config目錄,然後新建我們的properties, 如:jdbc-db.properties, redis.properties

2: 然後在我們的application啟動類上添加@propertySources註解引入我們的外部文件

注意:因為PropertySources 默認只解析.properties文件,如果要解析yml文件,需要指定factory只需要實現org.springframework.core下的 PropertySourceFactory 介面就OK了。

簡單的properties配置文件只需要按如下方式配置即可

只需要1,2步驟就可以完成外部文件的載入,如果涉及到線上修改配置就只需要手動修改配置文件,重新啟動應用即可生效。

3. springboot配置文件註解

springboot使用一個全局配置文件,配置文件的名字是固定的:
application.properties或application.yml

@ConfigurationProperties: 將 全局配置文件 的屬性值,映射到SpringBoot 組件 上
@Value: 從 全局配置文件 中讀取屬性,映射到組件上

@PropertySource: 載入指定的配置文件。可以配合 @Value 和 @ConfigurationProperties 使用。默認只能載入XML文件,若需要載入yml文件需要實現 DefaultPropertySourceFactory 的 createPropertySource() 方法,並在註解中聲明。spring boot 中 yml 、yaml 對應的載入類為 YamlPropertySourceLoader .

@ImportResource: 載入自定義的Spring XML 配置文件
SpringBoot不推薦使用這種方式,推薦使用全註解(javaConfig)的方式。
SpringBoot會掃描當前包和所有子包的註解配置到容器中。

4. SpringBoot的自定義配置

SpringBoot免除了項目中大部分的手動配置,對一些特定情況,我們可以通過修改全局配置文件以適應具體生產環境,可以說,幾乎所有的配置都可以寫在application.properties文件中,SpringBoot會自動載入全局配置文件,從而免除我們手動載入的煩惱。但是,如果我們自定配置文件,SpringBoot是無法識別這些配置文件的,此時就需要我們手動載入。接下來,將針對SpringBoot的自定義配置文件及其載入方式進行講解。

對於這種載入自定義配置文件的需求,可以使用@PropertySource註解結合@Configuration註解配置類的方式來實現。@PropertySource註解用於指定自定義配置文件的具體位置和名稱。同時,為了保證SpringBoot能夠掃描該註解,還需要類添加@Configuartion註解將實體類作為自定義配置類。
當然,如果需要將自定義配置文件中的屬性值注入到對應類的屬性中,可以使用@ConfigurationProperties或者@Value註解進行屬性值注入

打開SpringBoot項目的resources目錄,在項目的類路徑下新建一個test.properties自定義配置文件,在該配置文件中編寫需要的配置屬性

在com.david.pojo包下新創建一個配置類MyProperties,提供 test.properties 自定義配置文件中對應的屬性,並根據@PropertySource註解的使用進行相關配置

主要是一個自定義配置類,通過相關註解引入了自定的配置文件,並完成了自定義屬性值的注入。針對示例中的幾個註解,具體說明如下:
1)@Confiruation註解表示當前類是一個自定義配置類,並添加為Spring容器的組件,這里也可以使用傳統的@Component註解
2)@PropertySource("classpath:properties")註解指定了自定義配置文件的位置和名稱,此示例表示自定義配置文件為classpath類路徑下的 test.properties 文件
3)@ConfigurationProperties(prefix="test")註解將上述自定義配置文件 test.properties 中以test開頭的屬性值注入到該配置類屬性中
4)如果配置類上使用的是@Componnet註解而非@Configuration註解,那麼@EnableConfigurationProperties註解還可以省略

在SpringBoot框架中,推薦使用配置類的方式向容器中添加和配置組件
在SpringBoot框架中,通常使用@Configuration註解定義一個配置類,SpringBoot會自動掃描和識別配置類,從而替換傳統Spring框架中的XML配置文件。
當定義一個配置類後,還需要在類中的方法上使用@Bean註解進行組件配置,將方法的返回對象注入到Spring容器中,並且組件名稱默認使用的是方法名,當然也可以使用@Bean註解的name或value屬性自定義組件的名稱

在項目下新建一個

5. springboot實現動態載入遠程配置文件

有個獨立的API項目,該項目主要是對外部各個系統提供API介面,為了保證調用的安全,需要對請求進行校驗,主要校驗包括調用頻率,訪問IP,是否跨域和Token,其中IP和是否跨域的配置會根據接入方進行相應的修改,為了避免每次有新的接入方就得去修改一次配置文件並重啟項目,所以打算使用動態配置的方式。

初級實現方案:API服務每隔5分鍾向管理端請求一次數據,管理端添加IP和域白名單的管理,這個實現方案,簡單好用,但是弊端也明顯,管理端每次修改完配置後,客戶端需要等待下次請求後才會載入對應的配置,同時,還需要自己管理獲取到的配置文件

更新方案:在springboot啟動時,先從遠端獲取配置文件,並將其載入進Environment對象中,其餘的,就都交給Spring了。同時配合spring-cloud-context實現遠程配置變更後,本地重新拉取配置並更新

點進去之後,springboot會在這里初始化ConfigurableEnvironment對象

這里是給ConfigurableEnvironment做一些初始化工作,我們先不管了,重點在這里,listeners.environmentPrepared(environment);,Springboot通過事件,將Environment的載入分發出去

到此為止,我們就能像使用本地配置文件一樣使用伺服器上的配置文件了,但是這里還只實現了載入遠程配置文件,我們還需要在遠程配置文件變更時,實現配置文件的熱更新

6. SpringBoot中yaml文件配置屬性

首先,在SpringBoot中,有兩種配置文件的方式。一種是application.properties,另一種application.yaml(或者是application.yml)。
yaml文件格式是SpringBoot支持的一種JSON超集文件格式,相對於傳統的Properties配置文件,yaml文件以數據為核心,是一種更為直觀且容易被計算機識別的數據序列化格式。application.yaml配置文件的工作原理和application.properties是一樣的,只是yaml格式配置文件看起來要跟簡潔一些。
application.yaml文件使用 key:(空格) value 格式配置屬性,使用縮進控制層關系

注意:此時port和path屬性,屬於同一層級

其中縮進式寫法有兩種表示形式,一種為:

另一種為:

上述兩種縮進式寫法為person對象的hobby屬性賦值,其中一種是通過「-(空格)屬性值」的形式為屬性賦值,另一種是直接賦值使用英文逗號分隔屬性值。

行內式的寫法顯然比縮進式寫法更加簡潔。使用行內式寫法設置屬性值時,中括弧「[ ]」是可以省略的,程序會自動匹配校對屬性的值

在yaml配置的屬性值為Map或對象類型時,縮進式的形式按照yaml文件格式編寫即可,而行內式寫法的屬性值要用大括弧「{ }」包含

7. springboot載入自定義properties原理

springboot自定義屬性文件通過value註解引入,和@autowired不同的是,它是由這個來處理,屬性文件的讀取和注入是在BeanDefinition級別,對象實例化之前。

我們建一個簡單的類的梳理一下。

調用堆棧 從refresh開始,主要走了這幾個方法:

invokes
->processConfigBeanDefinitions
ConfigurationClassParser->doProcessConfigurationClass
ConfigurationClassParser->processPropertySource
ConfigurationClassParser->addPropertySource

ConfigurationClassParser主要方法:
doProcessConfigurationClass->processPropertySource->addPropertySource

邏輯主要集中在doProcessConfigurationClass方法
doProcessConfigurationClass負責解析@PropertySource,@Import annotations,@ComponentScan等註解 。
1 調用processPropertySource處理自身的propertySource
2 掃描類上的ComponentScan,對掃出的類繼續調用parse
3 處理@Import annotations等其他標簽

processPropertySource結構很簡單:
1根據註解里的location屬性載入配置文件
2調用addPropertySource處理每個屬性文件

addPropertySource這個類才是真正處理@value屬性:
1把用戶定義的properties文件加到Eniverment中去
2如果有相同name的屬性文件,需要合並

CompositePropertySource 的場景其實是你有兩個不同的文件,但是 @PropertySource中設置同樣的name屬性,這樣CompositePropertySource 會做一個合並,按加入的時間順序取。

增加一個proct2,PropertySource name都設置為myprod

debug到addPropertySource,newSource和existing已經不一樣了。
environment的propertySources里也有兩份文件了。

8. SpringBoot 配置文件詳解(告別XML)

快速學會和掌握 SpringBoot 的 核心配置文件的使用。

SpringBoot 提供了豐富的 外部配置 ,常見的有:

其中核心配置文件我們並不陌生,主要以Key-Value的形式進行配置,其中屬性Key主要分為兩種:

在 application.properties 添加配置如下:

① 添加數據源信息

在 application.propertis 添加配置如下:

① 添加認證信息,其中 socks.indentity.* 是自定義的屬性前綴。

② 添加隨機值,其中spring.test.* 是自定義的屬性前綴。

使用方法: @ConfigurationProperties(prefix = "spring.datasource")

使用說明:提供 Setter方法 和 標記組件 Component

如何驗證是否成功讀取配置?答:這里可以簡單做個驗證,注入 MyDataSource ,使用 Debug 模式可以看到如下信息:

使用方法: @Value("spring.datasource.*")

使用說明:提供 Setter方法 和 標記組件 Component

注意事項:@Value不支持注入靜態變數,可間接通過Setter注入來實現。

關於兩者的簡單功能對比:

顯然,前者支持松綁定的特性更強大,所以在實際開發中建議使用@ConfigurationProperties來讀取自定義屬性。

SpringBoot 默認會載入這些路徑載入核心配置文件,按優先順序從高到低進行排列:具體規則詳見 ConfigFileApplicationListener

如果存在多個配置文件,則嚴格按照優先順序進行覆蓋,最高者勝出:

舉個簡單的例子,例如再上述位置都有一個application.properties ,並且每個文件都寫入了server.port=xx (xx分別是9001,9002,9003,9004),在啟動成功之後,最終應用的埠為:9004。圖例:

如果想修改默認的載入路徑 或者 調改默認的配置文件名,我們可以藉助命令行參數進行指定,例如:

YAML是JSON的一個超集,是一種可輕松定義層次結構的數據格式。

答: 因為配置文件這東西,結構化越早接觸越規范越好。這里推薦閱讀阮一峰老師寫的 YAML語言教程 ,寫的很簡單明了。

引入依賴: 在POM文件引入 snakeyaml 的依賴。

使用說明: 直接在類路徑添加 application.yml 即可。

例如下面這兩段配置是完全等價的:

① 在 application.yml 配置數據源:

② 在 application.properties 配置數據源:

在項目的實際開發中,我們往往需要根據不同的環境來載入不同的配置文件。例如生產環境,測試環境和開發環境等。此時,我們可以藉助 Profiles 來指定載入哪些配置文件。例如:

溫馨提示:如果spring.profiles.active指定了多個配置文件,則按順序載入,其中最後的優先順序最高,也就是最後的會覆蓋前者。

使用方法:
使用Maven插件打包好項目,然後在當前路徑,執行DOS命令: java -jar demo.jar --server.port=8081 ,在控制台可看到應用埠變成了8081。

實現原理:
默認情況下,SpringBoot會將這些命令行參數轉化成一個 Property ,並將其添加到 Environment 上下文。

溫馨提示:
由於命令行參數優先順序非常之高,基本高於所有常見的外部配置,所以使用的時候要謹慎。詳見 PropertySource 執行順序 。

關閉方法:
如果想禁用命令行屬性,可以設置如下操作:springApplication.setAddCommandLineProperties(false)

9. Spring Boot 第二彈,配置文件詳解-史上最全

  Spring Boot 官方 提供了兩種常用的配置文件格式,分別是 properties 、 YML 格式。相比於 properties 來說, YML 更加年輕,層級也是更加分明。 強烈推薦使用 YML 格式

  Spring Boot項目 啟動會掃描以下位置的 application.properties 或者 application.yml 作為默認的配置文件.

徒手撕源碼

內部類Loader的load方法

getSearchLocations()方法

asResolvedSet()

下面給出優先順序 從高到低 的配置文件排列順序:

以設置應用埠為例 初體驗Spring Boot配置文件

properties後綴結尾(application.properties)

yml/yaml後綴結尾(application.yml/application.yaml)

數字,字元串,布爾,日期

對象、Map

數組

數字,字元串,布爾,日期

對象、Map

數組

@ConfigurationProperties(prefix = "person")詳解

標注在類上

標注在方法上

綜上所述

  @ConfigurationProperties 註解能夠輕松的讓配置文件跟實體類綁定在一起。

 值得關注的是: @ConfigurationProperties 這個註解僅僅是支持從 Spring Boot的默認配置文件 中取值,也就是 application.properties 、 application.yml 、 application.yaml ,那我們如何從自定義配置文件取值呢???

 別著急,有解決辦法,那就是再加一個註解: @PropertySource(value = "classpath:custom-profile.properties") ,下面會有對 @PropertySource 註解的介紹。請耐心往下面看。

使用@PropertySource註解

對應配置文件

創建兩個配置文件 custom-profile.yml、custom-profile1.yml ,如下去引入。

我們可以通過控制變數法進行測試,具體過程我這里就不贅述了。

直接說 結論 吧: Spring載入順序 為 從左到右順序載入 ,後載入的會 覆蓋 先載入的屬性值。

另外需要注意的是 : @PropertySource 默認載入 xxx.properties類型 的配置文件,不能載入 YML格式 的配置文件。如何解決呢?下面來解決這一問題

對應配置文件:

編寫PropertiesController

擴展功能

application.yml 主配置文件

application-dev.yml 開發配置文件

application-prod.yml 生產配置文件

application-test.yml 測試配置文件

(1)主配置文件:配置激活選項

(2)其他配置文件:指定屬於哪個環境(同yml,只不過表現形式是 key=value 的,三個配置文件分別是: application-dev.properties , application-prod.properties , application-test.properties )

 無論是使用上述 多文檔塊 的方式,還是新建 application-test.yml 文件,都可以在配置文件中指定 spring.profiles.active=test 激活指定的profile。

感謝閱讀小生文章。祝大家早日富可敵國,實現財富自由。

寫文不易 ,一定要 點贊、評論、收藏哦 , 感謝感謝感謝!!!

10. Springboot 使用@RefreshScope 註解,實現配置文件的動態載入

實現配置文件動態讀取的好處不必多說,修改配置文件後不必重啟Application ,想想就開心。

合格調包俠的必備技能,從Maven倉庫引入依賴的Jar包,

搞好配置文件,默認在application.yml /properties 就行,與本功能相關的配置項(採用yml格式)如下:

distributed-id是自定義需要動態部署的配置文件。management:是暴露refresh介面,不加此條配置將無法啟用動態載入配置文件的功能(也就是管你理解不理解,別問,加就對了)。

1.編寫自定義配置文件的Java對象,一定要在類上加@RefreshScope註解

@data是lombok的註解,別的註解不多說。

2.編寫你的conroller ,也一定要加@RefreshScope註解, 不加的話,呵呵,對不起,無法運行。。原因嗎---在這 @RefreshScope not working - Spring Boot - Stack Overflow

   我這里是返回配置文件中distributed-id.mechineId的值。

3.到此為止了,簡單吧😒。其實的話,第一步也可以直接在Bean的配置中心(也就是@Configuration註解的類)搞一下,效果是一樣的。

使用這種寫法,就可以不用在配置對象類上加@Component和@RefreshScope。

測試一下啦,啟動應用前,將配置文件設置如下:

運行程序後,在瀏覽器輸入你的測試地址,返回如下,是5沒錯了:

然後找到你編譯後文件,修改配置文件的值,注意是 編譯後的配置文件     就是下圖中灰色文件的位置

修改如下:mechineId修改為4

接下來向 http://localhost:port/actuator/refresh 發送 POST 請求,get請求是無法識別的呦😘,可以看到返回了配置文件中被更改的屬性

測試一下,沒錯了,返回值為4

閱讀全文

與springboot載入配置文件屬性相關的資料

熱點內容
設置密碼的pdf文件如何轉換成word 瀏覽:876
多個文件合並到一起後叫什麼 瀏覽:387
資料庫位是什麼意思 瀏覽:104
如何改變手機上的網路連接 瀏覽:908
某網站圖片侵權如何舉報 瀏覽:820
zemax宏編程有什麼用 瀏覽:874
做保函為什麼要獲取招標文件 瀏覽:921
魔獸世界數據是哪個文件夾 瀏覽:439
oppor9s手機系統升級 瀏覽:728
文件上傳ie8 瀏覽:619
cleanmymac恢復文件 瀏覽:241
win10裝虛擬機沒有網路 瀏覽:283
安排什麼意思網路語言 瀏覽:837
順豐常州寄份文件到廣州多少錢 瀏覽:73
wow110掛機升級 瀏覽:967
請問有什麼app可以壓縮視頻 瀏覽:195
凱美瑞藍牙連接不了蘋果手機啊 瀏覽:923
手機無法搜索到網路列印機驅動 瀏覽:411
pdf文件如何將背景灰色的變成透明 瀏覽:269
南漳如何網路推廣 瀏覽:525

友情鏈接