Ⅰ SpringBoot配置文件存放位置以及讀取順序
默認情況下,我們可以將application.properties或者application.yaml(為了方便演示,本文以下均以application.properties介紹)放置在如下四處:
1.1、idea中,為了我們本地方便開發測試,我們在此處創建一個config目錄,然後把application.properties放進去,項目正常運行。
jar包會自動生成在target目錄下。
我們將生成的jar包,復制出來,到另外文件夾進行運行,比如,我現在該jar包復制到test目錄下,但是這個時候是起不來,因為沒有配置文件,雖然我們在idea裡面是有config目錄的,但是它並不沒有被打包進去。我們要把config目錄也復制過來,跟該jar包放在同一個目錄下。
在此處,我們可以使用java -jar demo-0.01-SNAPSHOT來運行項目。
正常運行。
當我們將其打成jar包時,application.properties同樣不會被打包進jar包中。需要另外復制出來和jar包放在才能正常運行。
推薦以上兩種方式來放置配置文件,如果不寫開發,測試,和生產好幾套環境配置文件的話,就可以直接打開配置文件,改成自己需要的配置即可。
以下兩種方式是將該配置文件打包在jar包裡面了,即便只改一個埠號,開發人員先改配置文件,再打包,再運行。此處也記錄下,並解開jar包,看下該配置文件被打包後,放置的位置。
打包後,如下圖,jar包再target裡面,我們尋找下application.properties文件。為了方便演示,我們將target目錄下的demo-0.0.1-SNAPSHOT.jar放到一個新目錄給它解壓開,找下該配置文件,我放置到了一個test目錄下。
解壓後:如下圖,我們進入目錄
發現config目錄被放置在classes目錄下。然後這也就讓我們明白了,什麼是classpath?classpath的路徑到底指的是哪裡,在idea中我們就把它放置在resource目錄,該目錄就是表示classpath。而被打成jar包後classes目錄就是所謂的classpath。
所有的yaml文件,同理。
Ⅱ 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屬性自定義組件的名稱
在項目下新建一個
Ⅲ 二、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 - resource資源文件的打包配置詳解(指定資源文件位置)
(1)默認 Spring Boot 項目結構,資源文件放置在 src/main/resources 中,測試的資源文件在 src/test/resources 中。
src/main/resources 與 src/test/resources 的區別:
(2)將項目打包後,解壓 jar 可以發現原先 src/main/resources 目錄下的資源文件已經被打包進來了:
(3)但有時我們的資源文件並不一定是放在 src/main/resources 目錄下,比如我的項目通常會將資源文件放在 src/test/resources 目錄下:
原因:根據實踐經驗表明,測試完後的配置項是最完整的,且經常會忘記替換正式版參數,因而選擇將配置文件全部放置在 src/test/resources 目錄下。
(4)又比如 mybatis 的 mapper.xml 文件,我們習慣把它和 Mapper.java 放一起
(5)但上面這兩種情況的資源文件,在使用 maven 打包時是不會被打包進 jar 的。這時候我們便要指定需要打包的資源文件,這個有如下兩種方法可以實現。
(1)<resources> 標簽位於 <build> 標簽內,用於指定項目資源文件的位置。比如下面配置我們指定了 src/test/resources 也是資源文件目錄:
(2)而對於寫在包下的 Mapper.xml 文件,我們則可以通過如下配置指明資源文件位置:
提示:其中 * / 這樣的寫法,是為了保證各級子目錄下的資源文件被打包。
(3)我們還可以通過 excludes 標簽剔除不需要的資源:
(1)除了使用 <resources> 標簽外,我們也可以使用 maven-resources-plugin 插件實現同樣的目的。比如下面配置把 src/test/resources 目錄下的資源文件打包到 classes 目錄下:
(2)而對於寫在包下的 Mapper.xml 文件,我們也可以通過 maven-resources-plugin 插件將其打包到相應位置:
(3)使用 maven-resources-plugin 插件時,我們同樣可以通過 excludes 標簽剔除不需要的資源:
Ⅳ Springboot配置文件讀取-ConfigFileApplicationListener
ConfigFileApplicationListener 主要作用就是讀取應用的配置文件並add到Environment的PropertySources列表裡
Springboot應用在啟動的時候准備好了環境後就會觸發 事件就開始執行讀取配置的邏輯:
首先載入當前激活的Profile列表
然後從默認的 classpath:/,classpath:/config/,file:./,file:./config/ 這四個目錄下
查找默認的application-{profile}名字對應的配置文件,配置文件格式支持兩大類(Properties和Yaml)既:.properties .xml .yml .yaml
可以修改默認的配置文件名字(默認:application),可以指定多個比如 --spring.config.name= application,demo
可以修改默認的配置文件路徑,比如 --spring.config.location= file:///C:/config/ (目錄結尾不帶「/」會按照文件處理,而不是目錄,容易掉坑)
閱讀源碼入口就從他的onApplicationEvent開始跟即可,將自身添加到postProcessor列表裡並執行postProcessEnvironment方法,核心邏輯是靠一個Loader內部類
new Loader(environment, resourceLoader).load()
大概就是,如果沒有spring.profiles.active 和 spring.profiles.include都沒有特別指定激活的profile的話
沒有特別指定profile的話就是:null + default,也就是我們常見的application.properties 和 application-default.properties這種
如果指定了那就是:null + 已經激活(pre-existing)的profile + spring.profiles.active + spring.profiles.include
舉個例子,假如激活了多個profile比如:--spring.profiles.active=prd1,prd2,最終優先順序上prd1 > prd2 > default(null)
Ⅵ 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
Ⅶ Spring Boot 外置配置文件
默認情況下,我們 spring boot 項目的配置文件<small>(application.yaml、application.properties)</small>是在項目的 jar 包『裡面』的。
如果是要改配置文件中的配置項時,就需要將項目重新打包,在某些情況下,這就顯得十分不方便。
對此,我們可以將 spring boot 項目的配置文件『挪到』jar 包之外,然後再啟動 spring boot 項目時再指定它使用外部的這些配置文件。
根據上述的 <outputDirectory> 的配置,相關的配置文件會被復制到 target 下的 resources 目錄中,並且,jar 包中也不會包含你所配置的這些配置文件。
這種情況下,在啟動 spring boot 項目時,需要額外的參數( -Dspring.config.location )告訴它項目的配置文件在哪:
注意:
spring boot 默認是以 classpath:/,classpath:/config/,file:./,file:./config/ 這樣的配置在查找、載入配置文件,有意思的是查找順序是上述配置的反向順序:
因此,如果你在 spring.config.location 中也定義了多個配置文件位置,例如: classpath:/custom-config/,file:./custom-config/ , 那麼配置文件的查找、載入順序同樣是反向的:
另外,還有一個功能相似的配置 spring.config.additional-location ,使用它的話,它會作為默認配置路徑的『 擴展配置 』路徑來使用。擴展的配置路徑會比默認的配置優先被掃描到. 比如說, 如果設置了擴展的配置文件所在路徑為: classpath:/custom-config/,file:./custom-config/ , 那麼查找路徑將會是下面的順序:
這種掃描順序使得你可以通過自己的自定義配置來修改默認的配置項。
Ⅷ 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會掃描當前包和所有子包的註解配置到容器中。
Ⅸ spring boot自定義配置文件數據源
SpringBoot支持動態的讀取文件,留下的擴展介面 org.springframework.boot.env.EnvironmentPostProcessor 。這個介面是spring包下的,使用這個進行配置文件的集中管理,而不需要每個項目都去配置配置文件。這種方法也是springboot框架留下的一個擴展(可以自己去擴展)
在 /Users/naeshihiroshi/study/studySummarize/SpringBoot/ (自己測試也可以隨機在一個目錄下建立一文件),目錄下建立一個名為 springboot.properties 文件,
springboot.properties 中定義一些配置,配置如下:
定義 MyEnvironmentPostProcessor 實現 EnvironmentPostProcessor 介面
在classpath定義一個 META-INF 文件夾然後在其下面先建 spring.factories 文件,在其中指定:
啟動類測試:
列印結果:
Ⅹ 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)