Author:SimpleWuhtml
SpringBoot使用兩種全局的配置文件,全局配置文件能夠對一些默認配置進行修改。mysql
這兩個配置文件使咱們SpringBoot啓動的時候回默認加載的配置文件。web
配置文件放在src/main/resources目錄或者類路徑/config下,這個配置文件的路徑是有優先級的,至於優先級後面再說。spring
首先這兩個文件中properties這個文件不須要多說使咱們常常使用的資源文件,但是這個Yml是什麼呢?後面再說sql
SpringBoot不須要添加複雜的web.xml或者spring.xml等配置文件,spring只有一個配置文件,也非必須的。json
默認的配置文件是application.properties。數組
#修改端口號 server.port=8888 #定義項目的訪問目錄 server.context-path=/springboot
咱們使用IDEA須要注意,圖就不截圖太麻煩了:springboot
若是properties文件中出現亂碼,找到setting中,在file encoding中勾選Transparent native-to-asci conversion。數據結構
YAML文件
除了默認的properties文件,SpringBoot還提供另一種配置文件yml,這種文件提供一種更加簡潔的方式編寫配置信息。
yml是YAML(YAML Ain‘t Markup Language)語言的文件,是一種標記語言,以數據爲中心,比json、xml等更適合作配置文件,有想法的能夠去網上搜搜資料學習下。
參考語法規範:
官方參考: http://www.yaml.org
yml學習參考:https://www.yiibai.com/yaml/yaml_syntax_primitives.html
YAML基本語法:
例子:
server: port: 8081 servlet: context-path: springboot
注意:【:後必須跟一個空格】,兩種方式推薦使用yml方式配置項目。
YAML語法
YAML支持的三種數據結構。
字面量
YAML中字面量屬於普通的值。以key: value來表示,value前必須帶一個空格。
字面量,字符串默認不須要單雙引號。
雙引號:會轉義字符,特殊字符會被轉義。(name: "SimpleWu\n lisi" //輸出:SimpleWu換行 lisi)
單引號:不會轉義字符,特殊字符不會被轉義。(name: 'SimpleWu\n lisi' //輸出:SimpleWu\n lisi)
server: port: 8081
對象、Map
在YAML中,對象和Map都是以鍵值對的方式表示。在下一行來編寫屬性和值得關係,注意縮進。
users: firstName: SimpleWu email: lovelyWu98k@gmail.com
對象還有另外一種寫法,看到這種寫法是否是想到了JSON?
users: { firstName: zhangsan, email: lovelyWu98k@gmail.com }
數組
用-值得方式來表示數組中的一個元素。
users: - SimpleWu - lovelyWu98k@gmail.com - addressisnot
另一種寫法,仍是像JSON
users: [SimpleWu,lovelyWu98k@gmail.com,addressisnot]
springboot支持咱們直接將properties或者yml中的屬性映射到某個實體類,看例子。
mysql: url: jdbc:mysql:///springboot port: 3306 user: root pass: root
假如在資源中咱們如今有個mysql的連接信息,咱們如何將它映射到實體類中去呢?
有兩種方式:
@ConfigurationProperties
使用IDEA當咱們添加了@ConfigurationProperties註解後,在頁面上回出現一個錯誤提示,咱們須要加入依賴。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency>
編寫JAVA類MySQLInfo.java
//java類 @ConfigurationProperties(prefix = "mysql") @Component public class MySQLInfo { private String url; private Integer port; private String user; private String pass; //省略getset }
咱們只須要指定prefix便可,他就會加載咱們yml配置前置爲mysql的屬性。
@Value
若是咱們使用這個註解來獲取屬性使用方式是:
//java類 @Component public class MySQLInfo { @Value("${mysql.url}") private String url; @Value("${mysql.port}") private Integer port; @Value("${mysql.user}") private String user; @Value("${mysql.pass}") private String pass; //省略getset }
注意若是須要使用表達式只有@Value才能夠,@Value("#{10*2}) 結果爲:20
兩種方式的區別:
@ConfigurationProperties | @Value | |
---|---|---|
功能 | 批量注入配置文件中的屬性 | 一個個指定 |
鬆散綁定 | 支持 | 屬性名必須徹底匹配 |
SPEL表達式 | 不支持 | 支持 |
JSR303效驗 | 支持 | 不支持 |
複雜類型 | 支持 | 不支持 |
兩種方式的適用場合:
當只須要爲某個值提供注入時,推薦使用@Value方式。
當須要對整個對象的總體進行賦值時,使用@ConfigurationProperties。
若是咱們將全部的配置信息都寫在application.yml文件中,則到時候yml文件會變得很是龐大,不太方便咱們進行維護。
咱們能夠對配置中的內容進行拆分,拆分到多個文件中。這樣就提升了配置的可維護性。
引入外部配置文件:
第一種方式:@ProperSource方式:須要注入的類的前面使用該註解。
第二種方式:@ImportResource方式首先添加一個spring的配置文件,在裏面添加須要映射的類。在啓動的SpringBootApplication前面使用該註解
第三種方式:@Configuration和@Bean方式添加一個自定義配置類。
//第三種方式 @Configuration public class MyConfig { //將方法的返回值添加到容器中;容器中這個組件默認的id就是方法名 @Bean public MySQLInfo mySQLInfo(){ System.out.println("配置類@Bean給容器中添加組件了..."); return new MySQLInfo(); } }
切換多個外部配置文件
真實環境中,有時候須要配置多個配置文件,可使用spring.profile.active來進行切換。
好比如今咱們有三個配置文件:
咱們在application.yml中經過spring.profile.active = dev(prod)來選擇須要加裝的配置文件。
或者咱們能夠經過maven將項目打成jar包經過命令行使用如下命令來指定環境
java –jar springboot02-0.0.1-SHAPSHOT.jar –spring.profiles.active=dev
文檔塊
在yml文檔中,能夠適用---來將一個文檔拆分爲多個文檔塊。能夠在不一樣文檔塊中分別定義不一樣的環境。
而後經過spring.profiles=xxx來對文檔塊進行命名。最後經過第一個文檔塊制定spring.profiles.active=xxx來指定到底激活哪一個文檔塊。
#application.yml spring: profiles: active: dev #指定激活dev文檔 --- server: port: 8081 spring: profiles: dev #給文檔命名爲dev
配置文件加載位置和順序
springboot啓動會掃描一下位置的配置文件做爲springboot的默認配置文件。
以上是按照優先級從高到低的順序,全部位置的文件都會被加載,若是衝突的狀況,高優先級配置內容會覆蓋低優先級配置內容。若是不衝突,造成互補配置。
咱們也能夠經過配置spring.config.location來改變默認配置。使用命令行方式加載,不然優先級不夠。
java –jar xxxx.jar –spring.config.location=配置文件路徑
外部配置加載順序
pringBoot也能夠從如下位置加載配置;優先級從高到低,高優先級的配置覆蓋低優先級的配置,全部配置造成互補配置。
官方參考文檔:https://docs.spring.io/spring-boot/docs/1.5.9.RELEASE/reference/htmlsingle/#boot-features-external-config
SpringBoot啓動會加載大量的自動配置類
咱們看咱們須要的功能有沒有SpringBoot默認寫好的自動配置類;
咱們再來看這個自動配置類中到底配置了哪些組件;(只要咱們要用的組件有,咱們就不須要再來配置了)
給容器中自動配置類添加組件的時候,會從properties類中獲取某些屬性。咱們就能夠在配置文件中指定這些屬性的值;
自動配置原理:SpringBoot啓動的時候,加載主配置類,開啓了自動配置功能@EnableAutoConfiguration。
利用EnableAutoConfigurationImportSelector給容器中導入一些組件。
導入的文件在都配置在文件META‐INF/spring.factories中的EnableAutoConfiguration屬性來獲取的。每個這樣的 xxxAutoConfiguration類都是容器中的一個組件,都加入到容器中;用他們來作自動配置。
每個自動配置類進行自動配置功能;
根據當前不一樣的條件判斷,決定這個配置類是否生效?
這些組件的屬性是從對應的properties類中獲取的,這些類裏面的每個屬性又是和配置文件綁定的;
全部在配置文件中能配置的屬性都是在xxxxProperties類中封裝者‘;配置文件能配置什麼就能夠參照某個功能對應的這個屬性類