導航:首頁 > 文件管理 > springboot配置文件的理解

springboot配置文件的理解

發布時間:2023-07-03 19:31:07

1. SpringBoot的默認配置文件是什麼

對SpringBoot來說,雖然application.yml配置文件更加常見,但是其實默認配置文件是application.properties,當然其格式專可屬以是properties也可以是yaml格式;

除此之外,其配置文件也可以是bootstrap.yml。這個配置文件是SpringCloud新增的啟動配置文件,它的特點和用途:

- bootstrap比application優先載入
- 由於bootstrap比application更早載入,所以application不會被它覆蓋
- 使用配置中心Spring Cloud Config時,需要在bootstrap中配置一下配置中心地址,從而實現從配置中心拉取配置項到當前服務中

如果你對默認配置文件是什麼不理解,就去黑馬程序員官網視頻庫看免費視頻。

2. Springboot 讀取配置文件原理

Springboot 讀取配置文件(application.yaml, application.properties)的過程發生在SpringApplication#prepareEnvironment() 階段,而prepareEnvironment又屬於整個Springboot 應用啟動的非常前置階段,因為Environment的准備是後續bean創建的基礎。讓我們來一探啟動是的詳細code。除去StopWatch這些code,可以發現prepareEnvironment 發生在SpringApplication#run 這在整個應用啟動的多步實質性操作中幾乎是第一步。

而prepareEnvironment中最重要的是通過觸發listener(EventPublishingRunListener)來通過#multicastEvent發出。

而#multicastEvent的實現其實也很簡單,找到相關的監聽的listener,然後一個個的調用他們的Listener#onApplicationEvent(event)方法,而這其中就包括了處理configuration文件的listener。
在Springboot 2.4.0 之前這個處理configuration 文件的lister是ConfigFileApplicationListener,在2.4.0之後,處理configuration 文件的lister是,並且對configuration文件的載入做了較大的改變,導致一些行為可能出現了變化,這也就是下面要詳細講的內容。

Springboot 2.4.0之後,configuration 文件的load順序按照優先順序是如下順序(序號大的會被小的覆蓋):

和之前版本比較,整體的屬性載入順序並無調整,只有Application properties(14,15)這里有順序的調整,具體調整為:

如果存在多個active的profiles,例如[Test, Dev], 那麼對於同時存在兩個profile 配置文件中的配置,後面的profile里的配置(Dev)會覆蓋前面profile(Test)里配置的值。

前面講了這么多,終於要引出Springboot 2.4之後配置文件載入的行為變化了。

考慮這樣的情況,如果我想在跑Springboot test的時候指定特定的profile,那麼可以在Test class中加入@ActiveProfile("Test")。 如果我的應用中存在的某個自定義listener中,會根據當前environment 設置profile,如env.addActiveProfile("Dev")。
當前就會有兩個active profile,由於springboot-test會在調用application#run 前利用DefaultActiveProfilesResolver把@ActiveProfile註解定義的profile(Test)先加入了active的profile,等test run的時候 env.addActiveProfile("Dev") 又會把"Dev"也作為active profile 加入,這時候當前的active profile便為["Test", "Dev"]。

據上面介紹,後面的profile(Dev)對應的configuration 會覆蓋前面的(Test)。可Springboot 2.4.0之前的版本為我們做了調整,讓Test class中@ActiveProfile內定義的profile所對應的配置文件成為最高優先順序。

剛才提到在Springboot 2.4.0 之前這個處理configuration 文件的lister是ConfigFileApplicationListener,我們
來看看ConfigFileApplicationListener的相關code。

查看initializeProfiles(),發現此時對profile的順序做了調整,將activatedViaProperty (Test) 放在最後add,於是profile的順序就變成了[Dev, Test]。

在profiles.poll()時原本profile的順序已經倒了過來,已經變為[Dev, Test], 在load()方法中由於後置的Test profile,application-Test.yaml中的值最終生效了。

可是到了Springboot2.4.0之後,ConfigFileApplicationListener被deprecated了,取而代之的是,通過調用來完成configuration載入。
.java

.java

只是老老實實的set了active profile,並沒有調換profile的順序。最後調用定義在spring.factories中的resource loader class來load 配置文件。

YamlPropertySourceLoader.java

插一句,Springboot為我們提供了很好的yaml文件parse的code,當你需要解析yaml文件時不妨直接參考Springboot的YamlPropertySourceLoader

這樣一旦應用升級到Springboot 2.4.0之後相同的test code會使用application-Dev.yaml中配置的值,造成了test結果的改變。
如果要解決這個問題,根據上面介紹的配置文件優先順序順序,可以在@SpringbootTest中設置properties 來作為最終的配置覆蓋當前profile對應的配置。

了解一個框架很不容易,一個小小的變化都有可能造成應用的行為變化,唯有刨根問底,不斷總結才是framework人解決一切問題的不變的方法論。

3. 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文件格式編寫即可,而行內式寫法的屬性值要用大括弧「{ }」包含

4. 二、SpringBoot的配置--yaml

SpringBoot使用一個全局的配置文件,配置文件名是固定的;

配置文件的作用:修改SpringBoot自動配置的默認值;SpringBoot在底層都給我們自動配置好;

YAML 是一個標記語言

標記語言:

以前的配置文件;大多都使用的是xxx.xml文件

YAML:以數據為中心,比json、xml等更適合做配置文件

YAML:配置例子

XML:

k:(空格)v : 表示一對鍵值對(空格必須有)

以空格的縮進來控制層級關系;只要是左對齊的一列數據,都是同一個層級的

屬性和值也是大小寫敏感;

k: v :字面直接來寫;

字元串默認不用加上單引號或者雙引號;

"" :雙引號;不會轉義字元串裡面的特殊字元; 特殊字元會作為本身想表示的意思

name : "zhangsan lisi" :輸出 : zhangsan 換行 lisi

'' :單引號;會轉義特殊字元,特殊字元最終只是一個普通的字元串數據

name: 'zhangsan lisi' : 輸出 ; zhangsan lisi

k: v : 在下一行來寫對象的屬性和值的關系 ;注意縮進

對象還是 k: v 的方式

行內寫法:

用- 值表示數組中的一個元素

行內寫法

配置文件

javaBean:

我們可以導入配置文件處理器,以後編寫配置就有提示了

調整 圖示:

配置文件yml還是properties他們都能獲取到值;

如果說,我們只是在某個業務邏輯中需要獲取一下配置文件中的某項值,使用@Value

如果說,我們專門編寫一個javaBean來和配置文件進行映射,我們就直接使用@ConfigurationProperties

@ImportResource:導入Spring的配置文件,讓配置文件裡面的內容生效

SpringBoot裡面沒有Spring的配置文件,我們自己編寫的配置文件,也不能自動識別;

想讓Spring的配置文件生效,載入進來;@ImportResource標注在一個配置類上

不來編寫Spring的配置文件

Spring Boot推薦給容器添加組件的方式;推薦全註解的方式

1、配置類@Configuration------>Spring配置文件

2、使用@Bean給容器中添加組件

我們在主配置文件編寫的時候,文件名可以是application-{profile}.properties/yml

默認使用application.properties的配置

1、在配置文件中指定spring.profiles.active=dev

2、在命令行:

java -jar spring-boot-02-config.jar --spring.profiles.active=dev;

可以直接在測試的時候,配置傳入命令行參數

3.虛擬機參數

-Dspring.profiles.active=dev

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

-file:./config/

-file:./

-classpath:/config/

-classpath:/

優先順序由高到低,高優先順序的配置會覆蓋低優先順序的配置

SpringBoot會從這四個位置載入主配置文件:互補配置

==我們還可以通過spring.config.location來改變默認的配置文件位置==

項目打包好以後,我們可以使用命令行參數的形式,啟動項目的時候來指定配置文件的新位置;指定配置文件和默認載入的這些配置文件共同起作用互補配置;

java -jar spring-boot-02-config.jar --spring.config.location=G:/application.properties

==SpringBoot也可以從以下位置載入配置;優先順序從高到低;高優先順序的配置低優先順序的配置,所有的配置會形成互補配置==

1.命令行參數

2.來自java:comp/env的JNDI屬性

3.java系統屬性

4.操作系統環境變數

5.RandomValuePropertySource配置的random.*屬性值

==有jar包外箱jar包內進行尋找==

==優先載入帶profile==

6.jar包外部的application-{profile}.properties 或 application.yml(帶spring.profile)配置文件

7.jar包內部的application-{profile}.properties 或 application.yml(帶spring.profile)配置文件

==再來載入不帶profile==

8.jar包外部的application.properties或者application.yml(不帶spring.profile)配置文件

9.jar包內部的application.properties或者application.yml(不帶spring.profile)配置文件

精髓:

1》springboot啟動會載入大量的自動配置類

2》我們看我們需要的功能有沒有springboot默認寫好的自動配置類

3》我們再來看這個自動配置類中到底配置了那些組件;(只要我們要用的組件有,我們就不需要再來配置了)

4》給容器中自動配置類添加組件的時候,會從properties類中獲取某些屬性,我們就可以在配置文件中指定這些屬性的值

閱讀全文

與springboot配置文件的理解相關的資料

熱點內容
手機桌面的文件路徑 瀏覽:892
改款新寶來怎麼使用手機app 瀏覽:281
dede工具 瀏覽:507
5g網盟app怎麼下載 瀏覽:486
微信備份老是連接中斷 瀏覽:886
出台多少份文件 瀏覽:380
鞋子怎麼搭配衣服的app 瀏覽:755
文件名使用的通配符的符號是什麼 瀏覽:916
lol分卷文件損壞怎麼辦 瀏覽:276
6分管車螺紋怎麼編程 瀏覽:732
海口農商銀行信用卡app是什麼 瀏覽:770
win10任務欄文件夾我的電腦 瀏覽:14
安卓nba2k18 瀏覽:776
文件夾密碼怎麼修改密碼 瀏覽:271
蘋果數據中心用什麼伺服器 瀏覽:769
省內圓通快遞寄文件夾需要多少錢 瀏覽:740
iphone程序加密 瀏覽:884
win10文件夾調整文件行高 瀏覽:681
創意手繪教程 瀏覽:754
微信刪除帳號信息 瀏覽:596

友情鏈接