springboot默認加載配置
SpringBoot使用兩種全局的配置文件,全局配置文件可以對一些默認配置進行修改。
- Application.properties
- application.yml
這兩個配置文件使我們springboot啟動的時候回默認加載的配置文件。
配置文件放在src/main/resources目錄或者類路徑/config下,這個配置文件的路徑是有優先級的,至于優先級后面再說。
首先這兩個文件中properties這個文件不需要多說使我們經常使用的資源文件,可是這個Yml是什么呢?后面再說
配置信息
SpringBoot不需要添加復雜的web.xml或者spring.xml等配置文件,spring只有一個配置文件,也非必須的。
默認的配置文件是application.properties。
#修改端口號 server.port=8888 #定義項目的訪問目錄 server.context-path=/springboot
我們使用IDEA需要注意,圖就不截圖太麻煩了:
如果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基本語法:
- 以鍵值對的方式表示屬性。(空格必須有)。
- 使用縮進表示層級關系
- 縮進時不允許使用Tab鍵,只允許使用空格。
- 縮進的空格數目不重要,只要相同層級的元素左側對齊即可。
- 屬性和值是大小寫敏感的。
例子:
server: port: 8081 servlet: context-path: springboot
注意:【:后必須跟一個空格】,兩種方式推薦使用yml方式配置項目。
YAML語法
YAML支持的三種數據結構。
- 字面量:普通的值。(數字,字符串,布爾)
- 對象:鍵值對的集合。(Map)
- 數組:一組按次序排列的值。(List,Set)
字面量
YAML中字面量屬于普通的值。以key: value來表示,value前必須帶一個空格。
字面量,字符串默認不需要單雙引號。
雙引號:會轉義字符,特殊字符會被轉義。(name: "SimpleWu lisi" //輸出:SimpleWu換行 lisi)
單引號:不會轉義字符,特殊字符不會被轉義。(name: 'SimpleWu lisi' //輸出:SimpleWu 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指定從配置文件中讀取屬性,prefix指定對應yaml文件中的名稱。
- @Value獲取配置的屬性值
@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
兩種方式的區別:
兩種方式的適用場合:
當只需要為某個值提供注入時,推薦使用@Value方式。
當需要對整個對象的整體進行賦值時,使用@ConfigurationProperties。
加載外部配置文件
如果我們將所有的配置信息都寫在application.yml文件中,則到時候yml文件會變得非常龐大,不太方便我們進行維護。
我們可以對配置中的內容進行拆分,拆分到多個文件中。這樣就提高了配置的可維護性。
引入外部配置文件:
- @PropertySource(value={"classpath:student.properties"})
- @ImportResource(locations={"classpath:spring.xml"}
- @Configuration和@Bean方式。(SpringBoot推薦方式)
第一種方式:@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
- application-dev.yml
- application-prod.yml
我們在application.yml中通過spring.profile.active = dev(prod)來選擇需要加裝的配置文件。
或者我們可以通過maven將項目打成jar包通過命令行使用以下命令來指定環境
java –jar springboot02-0.0.1-SHAPSHOT.jar –spring.profiles.active=dev</span class="hljs-attribute">
文檔塊
在yml文檔中,可以適用---來將一個文檔拆分為多個文檔塊。可以在不同文檔塊中分別定義不同的環境。
然后通過spring.profiles=xxx來對文檔塊進行命名。最后通過第一個文檔塊制定spring.profiles.active=xxx來指定到底激活哪個文檔塊。
#application.yml spring: profiles: active: dev #指定激活dev文檔 --- server: port: 8081 spring: profiles: dev #給文檔命名為dev
配置文件加載位置和順序
springboot啟動會掃描一下位置的配置文件作為springboot的默認配置文件。
- 項目路徑下的config文件夾
- 項目路徑下
- classpath路徑下config文件夾
- classpath路徑下
以上是按照優先級從高到低的順序,所有位置的文件都會被加載,如果沖突的情況,高優先級配置內容會覆蓋低優先級配置內容。如果不沖突,形成互補配置。
我們也可以通過配置spring.config.location來改變默認配置。使用命令行方式加載,否則優先級不夠。
java –jar xxxx.jar –spring.config.location=配置文件路徑
外部配置加載順序
pringBoot也可以從以下位置加載配置;優先級從高到低,高優先級的配置覆蓋低優先級的配置,所有配置形成互補配置。
- 命令行參數
- 來自java:comp/env的JNDI屬性
- Java系統屬性(System.getProperties())
- 操作系統環境變量
- RandomValuePropertySource配置的random.*屬性值
- jar包外部的application-{profile}.properties或application.yml(帶spring.profile)配置文件
- jar包內部的application-{profile}.properties或application.yml(帶spring.profile)配置文件
- jar包外部的application.properties或application.yml(不帶spring.profile)配置文件
- jar包內部的application.properties或application.yml(不帶spring.profile)配置文件
- @Configuration注解類上的@PropertySource
- 通過SpringApplication.setDefaultProperties指定的默認屬性
官方參考文檔:https://docs.spring.io/spring-boot/docs/1.5.9.RELEASE/reference/htmlsingle/#boot-features-external-config
springboot自動配置
SpringBoot啟動會加載大量的自動配置類
我們看我們需要的功能有沒有SpringBoot默認寫好的自動配置類;
我們再來看這個自動配置類中到底配置了哪些組件;(只要我們要用的組件有,我們就不需要再來配置了)
給容器中自動配置類添加組件的時候,會從properties類中獲取某些屬性。我們就可以在配置文件中指定這些屬性的值;
自動配置原理:SpringBoot啟動的時候,加載主配置類,開啟了自動配置功能@EnableAutoConfiguration。
利用EnableAutoConfigurationImportSelector給容器中導入一些組件。
導入的文件在都配置在文件META‐INF/spring.factories中的EnableAutoConfiguration屬性來獲取的。每一個這樣的 xxxAutoConfiguration類都是容器中的一個組件,都加入到容器中;用他們來做自動配置。
每一個自動配置類進行自動配置功能;
根據當前不同的條件判斷,決定這個配置類是否生效?
這些組件的屬性是從對應的properties類中獲取的,這些類里面的每一個屬性又是和配置文件綁定的;
所有在配置文件中能配置的屬性都是在xxxxProperties類中封裝者‘;配置文件能配置什么就可以參照某個功能對應的這個屬性類