Spring Boot 配置文件 yml與properties
1、配置文件
SpringBoot使用一個全局的配置文件,配置文件名是固定的;
?application.properties
?application.yml
配置文件的作用:修改SpringBoot自動配置的默認值;SpringBoot在底層都給我們自動配置好;
官方語法規
YAML(YAML Ain』t Markup Language)
YAML A Markup Language:是一個標記語言
YAML isn』t Markup Language:不是一個標記語言;
標記語言:
以前的配置文件;大多都使用的是xxxx.xml文件;
YAML:以數據為中心,比json、xml等更適合做配置文件;
YAML:配置例子
相當於XML:
2、YAML語法:
1、基本語法
k:(空格)v:表示一對鍵值對(空格必須有);
以空格的縮進來控制層級關係;只要是左對齊的一列數據,都是同一個層級的
屬性和值也是大小寫敏感;
2、值的寫法
字面量:普通的值(數字,字元串,布爾)
k: v:字面直接來寫;
字元串默認不用加上單引號或者雙引號;
「」:雙引號;不會轉義字元串裡面的特殊字元;特殊字元會作為本身想表示的意思
name: 「zhangsan
lisi」:輸出;zhangsan 換行 lisi
」:單引號;會轉義特殊字元,特殊字元最終只是一個普通的字元串數據
name: 『zhangsan
lisi』:輸出;zhangsan
lisi
對象、Map(屬性和值)(鍵值對):
k: v:在下一行來寫對象的屬性和值的關係;注意縮進
對象還是k: v的方式
行內寫法:
數組(List、Set):
用- 值表示數組中的一個元素
行內寫法
3、配置文件值注入
配置文件 application.yml
javaBean:
使用 @ConfigurationProperties 註解在idea會給我們提示,需要導入配置文件處理器。
我們點擊,會調到springboot 的官方文檔。
在pom導入配置文件處理器,以後編寫配置就有提示了:
1、properties配置文件在idea中默認utf-8可能會亂碼
調整
2、@Value獲取值和@ConfigurationProperties獲取值比較
@Value是以前spring底層的,使用@Value需要一個一個參數指定,@ConfigurationProperties批量注入配置文件中的屬性。更多比較如下:
配置文件yml還是properties他們都能獲取到值;
如果說,我們只是在某個業務邏輯中需要獲取一下配置文件中的某項值,使用@Value;
如果說,我們專門編寫了一個javaBean來和配置文件進行映射,我們就直接使用@ConfigurationProperties;
3、配置文件注入值數據校驗
@Validated
@ConfigurationProperties支持JSR303數據校驗,@Value不支持JSR303數據校驗。
4、@PropertySource&@ImportResource&@Bean
@PropertySource:載入指定的配置文件;
person.properties
Person.java
@ImportResource:導入Spring的配置文件,讓配置文件裡面的內容生效;
Spring Boot裡面沒有Spring的配置文件,我們自己編寫的配置文件,也不能自動識別;
想讓Spring的配置文件生效,載入進來;@ImportResource標註在一個配置類上
不來編寫Spring的配置文件
SpringBoot推薦給容器中添加組件的方式;推薦使用全註解的方式
1、配置類@Configuration——>Spring配置文件
2、使用@Bean給容器中添加組件
4、配置文件佔位符
1、隨機數
2、佔位符獲取之前配置的值,如果沒有可以是用:指定默認值
可以在配置文件中引用前面配置過的屬性(優先順序前面配置過的這裡都能用)。
$ 來指定找不到屬性時的默認值
5、Profile
Profile是Spring對不同環境提供不同配置功能的支持,可以通過激活、 指定參數等方式快速切換環境 。
1、多Profile文件
我們在主配置文件編寫的時候,文件名可以是 application-.properties/yml
比如開發環境:application-dev.properties
生產環境 :application-prod.properties
默認使用application.properties的配置;
2、yml支持多文檔塊方式
3、激活指定profile
1、在配置文件application.properties中指定 spring.profiles.active=dev
2、命令行:
可以直接在測試的時候,配置傳入命令行參數
3、虛擬機參數;
6、配置文件載入位置
springboot 啟動會掃描以下位置的application.properties或者application.yml文件作為Spring boot的默認配置文件
–file:./config/
–file:./
–classpath:/config/
–classpath:/
優先順序由高到底,高優先順序的配置會覆蓋低優先順序的配置;
SpringBoot會從這四個位置全部載入主配置文件;互補配置;
項目打包好以後,我們可以使用命令行參數的形式,啟動項目的時候來指定配置文件的新位置;指定配置文件和默認載入的這些配置文件共同起作用形成互補配置;
java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar –spring.config.location=G:/application.properties
這個對運維方面起到很大作用
7、外部配置載入順序
SpringBoot也可以從以下位置載入配置; 優先順序從高到低;高優先順序的配置覆蓋低優先順序的配置,所有的配置會形成互補配置
1.命令行參數
所有的配置都可以在命令行上進行指定
java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar –server.port=8087 –server.context-path=/abc
多個配置用空格分開; –配置項=值
2.來自java:comp/env的JNDI屬性
3.Java系統屬性(System.getProperties())
4.操作系統環境變數
5.RandomValuePropertySource配置的random.*屬性值
由jar包外向jar包內進行尋找;
優先載入帶profile
6.jar包外部的application-.properties或application.yml(帶spring.profile)配置文件
7.jar包內部的application-.properties或application.yml(帶spring.profile)配置文件
再來載入不帶profile
8.jar包外部的application.properties或application.yml(不帶spring.profile)配置文件
9.jar包內部的application.properties或application.yml(不帶spring.profile)配置文件
10.@Configuration註解類上的@PropertySource
11.通過SpringApplication.setDefaultProperties指定的默認屬性
所有支持的配置載入來源;
參考官方文檔
8、自動配置原理
配置文件到底能寫什麼?怎麼寫?自動配置原理;
官方部分截圖,更多配置請參考官網
配置文件能配置的屬性參照
1、自動配置原理:
1)、SpringBoot啟動的時候載入主配置類,開啟了自動配置功能 @EnableAutoConfiguration
2)、@EnableAutoConfiguration 作用:
利用EnableAutoConfigurationImportSelector給容器中導入一些組件?
可以查看selectImports()方法的內容;
List configurations = getCandidateConfigurations(annotationMetadata, attributes);獲取候選的配置
將 類路徑下 META-INF/spring.factories 裡面配置的所有EnableAutoConfiguration的值加入到了容器中;
每一個這樣的 xxxAutoConfiguration類都是容器中的一個組件,都加入到容器中;用他們來做自動配置;
3)、每一個自動配置類進行自動配置功能;
4)、以HttpEncodingAutoConfiguration(Http編碼自動配置)為例解釋自動配置原理;
下面代碼是HttpEncodingAutoConfiguration部分源碼
根據當前不同的條件判斷,決定這個配置類是否生效?
一但這個配置類生效;這個配置類就會給容器中添加各種組件;這些組件的屬性是從對應的properties類中獲取的,這些類裡面的每一個屬性又是和配置文件綁定的;
5)、所有在配置文件中能配置的屬性都是在xxxxProperties類中封裝者『;配置文件能配置什麼就可以參照某個功能對應的這個屬性類
精髓:
1)、SpringBoot啟動會載入大量的自動配置類
2)、我們看我們需要的功能有沒有SpringBoot默認寫好的自動配置類;
3)、我們再來看這個自動配置類中到底配置了哪些組件;(只要我們要用的組件有,我們就不需要再來配置了)
4)、給容器中自動配置類添加組件的時候,會從properties類中獲取某些屬性。我們就可以在配置文件中指定這些屬性的值;
xxxxAutoConfigurartion:自動配置類;
給容器中添加組件
xxxxProperties:封裝配置文件中相關屬性;
2、細節
自動配置類必須在一定的條件下才能生效;
我們怎麼知道哪些自動配置類生效;
我們可以通過啟用 debug=true 屬性(在配置文件中加入);來讓控制台列印自動配置報告,這樣我們就可以很方便的知道哪些自動配置類生效;
TAG:java技術會所 |