https://i.xue.taobao.com/my/learning.htm?spm=a2174.7365761.0.0.oxhqUo
第2章 Spring Boot 核心配置
2.1 Spring Boot的配置文件
Spring Boot 使用一個全局配置文件,放置在 src/main/resources 目錄或類路徑的 /config 下; application.properties application.yml
配置文件的作用:修改 Spring Boot 自動配置的默認值;
yml 是 YAML(YAML Ain't Markup Language)不是一個標記語言;
標記語言:以前的配置文件;大多都使用的是 xxxxx.xml文件;
YAML:以數據爲中心,配置數據的時候具有面向對象的特徵;比 json、xml 等更適合做配置文件;
2.2 YAML語法格式
2.2.1 YAML基本語法
key: value 表示一對鍵值對(冒號後面必須要有空格)
使用空格縮進表示層級關係
左側縮進的空格數目不重要,只要同一層級的元素左側對齊即可
key 與 value 大小寫敏感
2.2.2 YAML常用寫法
2.3 yaml 配置文件注入值
1)編寫 JavaBean
2)編寫 application.yml 配置文件
3)使用 SpringBoot 單元測試類進行測試
4)導入配置文件處理器,然後重新運行測試類,在編寫配置文件時就會提示
2.4 properties 配置文件注入值
將 application.yml配置文件中的內容註釋掉,編寫application.properties 配置文件
運行後,發現 properties 文件在 idea 上中文亂碼, 進行如下設置就會不會亂碼
2.5比較 @Value 和 @ConfigurationProperties 獲取值
使用 @Value 獲取值,把 Emp 類中的 @ConfigurationProperties 註釋掉
總結 @Value 與 @ConfigurationProperties 獲取值的差異:
@ConfigurationProperties | @Value | |
功能 | 批量注入配置文件中的屬性 | 一個個指定 |
鬆散綁定(鬆散語法) | 支持 | 不支持 |
SpEL | 不支持 | 支持 |
JSR303數據校驗 | 支持 | 不支持 |
複雜類型封裝 | 支持 | 不支持 |
2.6 JSR303數據校驗_配置文件注入的值
@Validate註解
2.7 加載指定配置文件
2.7.1 @PropertySource 加載局部配置文件
@ConfigurationProperties 默認從全局配置文件(application.properties/application.yml)中獲取值,
所有配置數據寫在全局配置文件中,顯得太臃腫了, 可將它們抽取出來,放到其他局部配置文件中。
2.7.2 @ImportResource 使用xml配置
SpringBoot提倡零配置, 即無xml配置,但是在實際開發中,可能有一些特殊要求必須使用 xml 配置;
這時我們可以通過 Spring 提供的 @ImportResource 來加載 xml 配置文件。
2.7.3 自定義配置類向容器注入組件
2.8 Profile 多環境支持
2.8.1 Profile介紹
Profile 是 Spring 用來針對不同的環境要求,提供不同的配置支持, 全局 Profile 配置使用的文件名可以是
application-{profile}.properties / application-{profile}.yml ; 如: application-dev.properties / application-prod.properties
演示案例:我們的項目環境分爲 開發 (dev)和 生產(prod)環境 ,開發環境下端口號爲 8082,
生產環境下端口號爲8888 。
2.8.2 properties 文件演示案例
創建兩個文件 application-dev.properties 與 application-prod.properties
激活指定profile
2.8.3 yml 文件演示案例
2.8.4 多種方式激活指定profile
2.9 配置文件加載位置
SpringBoot 啓動時,會掃描以下位置的 application.properties 或者 application.yml 文件作爲
Spring Boot的默認配置文件:
配置文件位置
說明
file:./config/
當前項目的config目錄下(最高級別)
file:./
當前項目的根目錄下
classpath:/config/
類路徑的config目錄下
classpath:/
類路徑的根目錄下(最低級別)
以上按照優先級從低到高的順序,將所有位置的配置文件全部加載,高優先級的配置內容會覆蓋低優先級的
配置內容。
優先級由高到底,高優先級的配置會覆蓋低優先級的配置;
SpringBoot會從這四個位置全部加載主配置文件;互補配置;
==我們還可以通過spring.config.location來改變默認的配置文件位置==
項目打包好以後,我們可以使用命令行參數的形式,啓動項目的時候來指定配置文件的新位置;指定配置文件和默認加載的這些配置文件共同起作用形成互補配置;
注意:如果使用IDEA創建的項目是 Module (如果是 Project 則忽略),當前項目的根目錄不是你這個項目所
有目錄(是Project所在目錄) ,這樣使用 file: 存放配置文件時會找不到配置
解決方式:更改工作路徑直接爲Module所有目錄 $MODULE_DIR$
配置文件到底能寫什麼?怎麼寫?
配置文件能配置的屬性參照
https://docs.spring.io/spring-boot/docs/2.0.6.RELEASE/reference/htmlsingle/#common-application-properties
2.10 外部配置加載順序
==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-{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)配置文件
10.@Configuration註解類上的@PropertySource
11.通過SpringApplication.setDefaultProperties指定的默認屬性
所有支持的配置加載來源;
注意:
SpringBoot推薦給容器中添加組件的方式;推薦使用全註解的方式
1、配置類**@Configuration**------>Spring配置文件
2、使用**@Bean**給容器中添加組件
/**
* @Configuration:指明當前類是一個配置類;就是來替代之前的Spring配置文件
*
* 在配置文件中用<bean><bean/>標籤添加組件
*
*/
@Configuration
public class MyAppConfig {
//將方法的返回值添加到容器中;容器中這個組件默認的id就是方法名
@Bean
public HelloService helloService02(){
System.out.println("配置類@Bean給容器中添加組件了...");
return new HelloService();
}
}
3、配置文件佔位符
1)隨機數
${random.value}、${random.int}、${random.long}
${random.int(10)}、${random.int[1024,65536]}
2)佔位符獲取之前配置的值,如果沒有可以是用:指定默認值
person.last-name=張三${random.uuid}
person.age=${random.int}
person.birth=2017/12/15
person.boss=false
person.maps.k1=v1
person.maps.k2=14
person.lists=a,b,c
person.dog.name=${person.hello:hello}_dog
person.dog.age=15