一、YAML用法
1、簡介
springboot默認有兩種配置文件
- application.properties
- application.yml(建議使用)
文件名固定,存放在classpath:/或classpath:/config/目錄下
可以通過配置文件修改springboot的默認配置
例如 server.servlet.context-path=/springboot 設置訪問路徑server.servlet.context-path詳細用法
注:springboot2.0中部分配置與springboot1.0中不同,有的被重命名或刪除
2、YAML用法
YAML不是一種標記語言,是專門來寫配置文件的語言,以數據爲中心,簡潔和強大,比xml、properties等更適合配置文件的編寫
YAML文件的後綴名爲.yml或.yaml
兩者比較
-
yaml
-
properties
YAML語法規則
- 大小寫敏感
- 使用縮進表示層級關係
- 縮進時不允許
- 使用Tab鍵進行縮進,只能使用空格(IDEA中Tab默認爲四個空格)
- 縮進的空格數目不重要,重要的是相同層級的元素左側要對齊
- ’ # '表示註釋
server:
port: 8081 # 寫法 key: value,冒號後面必須有空格
servlet:
context-path: /springboot
基本用法
YAML支持的數據結構有三種:
- 字面量:單個的,不可再分的值
- 對象:鍵值對的集合
- 數組:一組按次序排列的值
三種數據結構的用法:
- 字面量:普通的值,如數字、字符串、布爾值
number: 12.5
str: hello
name: 'tom cruise' #如果字符串包含空格或特殊字符,則必須使用引號引起來,單引號雙引號都可以,但有區別
name1: "tom \n cruise" #會對特殊字符進行轉義,會被作爲普通字符輸出,結果爲:tom \n cruise
name2: 'tom \n cruise' #不會對特殊字符進行轉義,結果爲:tom 換行 cruise
- 對象:也稱爲映射Map,包含屬性和值
#寫法1:換行寫
user:
name: tom
age: 20
sex: male
#寫法2:行內寫法
user: {name: tom,age: 20,sex: male}
- 數組:如List、Set等
#寫法1:一組短橫線開頭的行
names:
- tom
- jack
- alice
#寫法2:行內寫法
name: [tom,jack,alice]
二、爲屬性注入值
通過加載配置文件,爲類中的屬性注入值
使用.yml配置文件
創建一個JavaBean對象(User類)
application.yml文件,將要綁定的值
由於啓動SpringBoot時已經加載了applic.yml配置文件,只需要將值綁定過去就好
方法:使用@ConfigurationProperties註解,同時把當前類添加到容器中
@ConfigurationProperties作用:默認讀取全局配置文件獲取值,將當前類中所有屬性與配置文件中的user進行綁定
我們還可以在pom.xml文件中添加依賴方便編寫.yml文件
使用properties配置文件
application.properties文件
注:IDEA中properties文件默認使用UTF-8/GBK編碼,會出現中文的亂碼
解決辦法:
重要:如果同時存在application.yml和application.properties同時存在且配置衝突,優先使用application.properties中的配置(application.properties優先級更高)
使用@Value爲屬性注入值
@Value和@ConfigurationProperties的比較
- @Value只能一個個爲屬性注入值,而@ConfigurationProperties可以批量爲屬性注入值
- @Value不支持爲複雜類型封裝,而@ConfigurationProperties支持
三、多環境配置
可以爲不同環境提供不同的配置信息,如開發環境、測試環境、生產環境等
兩種方式:
- 創建多個properties文件
- 步驟:
1、創建不同環境的properties文件
文件命名必須符合application-xxx.properties格式,例如:
application-dev.properties
application-test.properties
application-prod.properties
2、在application.properties文件中指定要激活的配置
#application.properties文件中指定要激活的配置文件
spring.profiles.active=dev #激活application-dev.properties文件
- 定義yml文檔塊
- 在yml文件中使用三個短橫線(- - -)定義多個文檔塊
步驟:
1、在yml文件中定義多個文檔塊,表示不同的環境配置
2、在第一個文檔塊中指定要激活的配置
server:
port: 8080
spring:
profiles:
active: dev #激活dev環境
---
spring:
profiles: dev #配置環境名稱
server:
port: 8081
---
spring:
profiles: test
server:
port: 8082
---
spring:
profiles: prod
server:
port: 8083
四、加載外部配置文件
加載properties屬性文件
問題:@ConfigurationProperties默認是從全局配置文件中獲取值,如果想從外部的自定義屬性文件中獲取值怎麼辦?
解決:使用@PropertySource加載外部的屬性文件(可以加載多個外部的屬性文件)
加載spring配置文件或xml文件
問題:如果確實需要將配置寫在Spring的配置文件中,想加載xml文件怎麼辦?
解決:主配置類中使用@ImportResource加載外部的Spring配置文件
注:SpringBoot中不建議使用加載xml文件
使用註解方式添加組件
推薦使用全註解方式向容器中添加組件,使用@Configuration和@Bean註解
五、自動配置原理
1、執行流程
- SpringBoot啓動時加載主配置類,開啓了自動配置功能
@EnableAutoConfiguration - @EnableAutoConfiguration作用:
利用@Import({AutoConfigurationImportSelector.class})向容器中添加一些組件(自動配置類)
查看AutoConfigurationImportSelector中的selectImports()方法
查看List< String > configurations = this.getCandidateConfigurations(annotationMetadata, attributes); 獲取候選配置
查看SpringFactoriesLoader.loadFactoryNames方法
查看loadSpringFactories()方法
查看classLoader.getResources(“META-INF/spring.factories”)
掃描所有Jar包路徑下的META-INF/spring.factories文件並加載,獲取EnableAutoConfiguration對應的值(在spring-boot-autoconfigure-2.0.3.RELEASE.jar中)
將這些自動配置類(xxxAutoConfiguration) 添加到容器中 - 通過這些自動配置類來完成響應的自動配置功能
2、原理分析
以HttpEncodingAutoConfiguration爲例,就是以前在web.xml文件中配置的CharacterEncodingFilter過濾器
注意:
- 根據當前不同的條件判斷,決定自動配置類是否生效,即並不是所有的自動配置類都會生效
- 自動配置類xxxAutoConfiguration的屬性是從對應的xxxProperties類中獲取的
- xxxProperties類中的所有屬性是通過配置文件注入綁定的,我們可以通過配置文件指定這些屬性的值
3、總結
- SpringBoot啓動時會加載大量的自動配置類
- 通過這些自動配置類向容器中添加組件
- 通過這些組件來自動完成許多功能,簡化配置