SpringBoot使用一個全局的配置文件愉适,配置文件名application是固定的萍嬉;
有以下三種文件后綴是配置文件
yaml和properties配置文件同時存在耐床,properties配置文件的內(nèi)容會覆蓋yaml配置文件的內(nèi)容
application.properties
application.yml
application.yaml
配置文件的作用:修改SpringBoot自動配置的默認(rèn)值长赞;SpringBoot在底層都給我們自動配置好名眉;
為了更好的編寫配置文件,可以使用yaml來編寫坟乾,yml和yaml后綴的文件都是使用yaml來編輯的
一档桃、YAML(如果懂得可以略過這里)
YAML全名:YAML Ain't Markup Language
? YAML A Markup Language:是一個標(biāo)記語言
? YAML isn't Markup Language:不是一個標(biāo)記語言枪孩;
標(biāo)記語言:
? 以前的配置文件;大多都使用的是 xxxx.xml文件藻肄;
? YAML:以數(shù)據(jù)為中心蔑舞,比json、xml等更適合做配置文件嘹屯;
YAML語法
1.以空格的縮進來控制層級關(guān)系攻询;只要是左對齊的一列數(shù)據(jù),都是同一個層級的
2.次等級的前面必須是空格抚垄,不能使用制表符(tab)來代替空格
3.冒號之后如果有值蜕窿,那么冒號和值之間至少有一個空格,不能緊貼著
image.png
1.各種值的寫法
字面量:指的是(數(shù)字呆馁,字符串桐经,布爾)
k: y
字符串默認(rèn)不用加上單引號或者雙引號;
- " ":雙引號浙滤;不會轉(zhuǎn)義字符串里面的特殊字符阴挣;特殊字符會作為本身想表示的意思
name: "測試1 \n 測試2":
輸出:測試1 (換行再輸出) 測試2- ' ':單引號;會轉(zhuǎn)義特殊字符纺腊,特殊字符最終只是一個普通的字符串?dāng)?shù)據(jù)
name: "測試1 \n 測試2":
輸出:測試1 \n 測試2
對象畔咧、Map(屬性和值):
k: v在下一行來寫對象的屬性和值的關(guān)系茎芭;注意縮進
//第一種寫法
person:
name: 張三
gender: 男
age: 22
//第二種寫法
person: {name: 張三,gender: 男,age: 22}
數(shù)組(List,Set):
第一個值表示數(shù)組中的第一個值
//第一種寫法
fruits:
- 蘋果
- 桃子
- 香蕉
//第二種寫法
fruits: [蘋果,桃子,香蕉]
二誓沸、配置文件值的注入
在pom文件中插入以下代碼梅桩,然后運行項目之后會在配置文件編寫的時候有提示
<!--導(dǎo)入配置文件處理器,配置文件進行綁定就會有提示-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
1.編寫配置文件
//YAML的寫法
person:
name: 張三
gender: 男
age: 36
boss: true
birth: 1982/10/1
maps: {k1: v1,k2: v2}
lists:
- apple
- peach
- banana
dog:
name: 小狗
//properties配置文件的寫法
person.name=李四
person.age=34
person.birth=1986/09/12
person.boss=true
person.gender=女
person.lists=cat,dog,pig
person.maps.k1=v1
person.maps.k2=v2
person.dog.name="小黑"
這里需要注意的是拜隧,配置文件所對應(yīng)的bean文件必須在主程序類的同一包下
image.png
2.編寫Person文件(并添加上get宿百,set,tostring方法)
@ConfigurationProperties
將配置文件的每一個屬性值映射到這個組件中洪添,
告訴SpringBoot將本類中的所有屬性和配置文件中相關(guān)的配置進行綁定
prefix = "person" :配置文件中哪個下面的所有屬性映射到本類中
而這個組件必須是容器中的組件垦页,才能使用容器提供的@ConfigurationProperties功能
所以必須加上@Component注解,
即這兩個注解是搭配使用的
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String name;
private Integer age;
private Boolean boss;
private Date birth;
private Map<String,Object> map;
private List<Object> list;
private Dog dog;
3.測試
package cn.clboy.helloworldquickstart;
import cn.clboy.helloworldquickstart.model.Person;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class HelloworldquickstartApplicationTests {
@Autowired
private Person person;
@Test
void contextLoads() {
System.out.println(person);
}
}
結(jié)果1
測試用YAML配置文件寫法的結(jié)果如下
結(jié)果2
測試中用properties配置文件的寫法會出現(xiàn)中文會亂碼干奢,而且char類型還會拋出Failed to bind properties under 'person.gender' to java.lang.Character異常
中文亂碼解決方法
在設(shè)置中找到File Encodings痊焊,將配置文件字符集改為UTF-8,并勾選:Transparent native-to-ascii conversion
三忿峻、配置文件值注入兩種方式對比
配置文件值注入有兩種方式:
一個是上面提到的Spring Boot的@ConfigurationProperties注解
一個是spring原先的@value注解
兩種功能的比較
松散綁定:例如Person中有l(wèi)astName屬性薄啥,在配置文件中可以寫成 lastName 或 lastname 或 last-name 或
last_name 等
SpEL:
## properties配置文件
persion.age=#{2019-1986+1}
------------------------------------------分割線---------------------------------------
# Person類
#--------------------使用@ConfigurationProperties注解,會拋出異常--------------------
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private Integer age;
#--------------------使用@value注解炭菌,沒有問題--------------------
@Component
public class Person {
@Value("${person.age}")
private Integer age;
JSR303數(shù)據(jù)校驗
@ConfigurationProperties支持校驗罪佳,如果校驗不通過逛漫,會拋出異常image.png
@value注解不支持?jǐn)?shù)據(jù)校驗image.png
復(fù)雜類型封裝
@value注解無法注入map等對象的復(fù)雜類型黑低,但list、數(shù)組可以image.png
兩種方式小結(jié):
如果說酌毡,我們只是在某個業(yè)務(wù)邏輯中需要獲取一下配置文件中的某項值克握,就使用@Value
如果說,我們專門編寫了一個javaBean來和配置文件進行映射枷踏,就使用@ConfigurationProperties
四菩暗、注解解析
1、@PropertySource
注解的作用是加載指定的配置文件旭蠕,值可以是數(shù)組停团,也就是可以加載多個配置文件
使用@PropertySource({"classpath:person.properties"})指定加載person.properties配置文件
需要指定加載多個配置文件時{"classpath:person.properties"佑稠,"classpath:person.properties"}
使用這個注解加載配置文件就需要配置類使用@component等注解而不是等待@EnableConfigurationProperties激活,而且不支持yaml旗芬,只能是properties
2舌胶、@ImportResource
@ImportResource:用于導(dǎo)入Spring的配置文件,讓配置文件里面的內(nèi)容生效疮丛;(就是以前寫的springmvc.xml幔嫂、applicationContext.xml)
Spring Boot里面沒有Spring的配置文件辆它,我們自己編寫的配置文件,也不能自動識別履恩;想讓自己寫的Spring的配置文件生效加載進來锰茉;就需要吧@ImportResource標(biāo)注在一個配置類上
3、@Configuration
這是SpringBoot推薦給容器中添加組件的方式切心;推薦使用全注解的方式
配置類@Configuration ---等于---> Spring配置文件
3.1 @Bean
/***
* @Configuration
* 指明當(dāng)前類是一個配置類洞辣;就是用來代替之前的Spring配置文件
* Spring配置文件中是用<bean></bean>標(biāo)簽來添加組件
* 而這里只需要用 @Bean
*/
@Configuration
public class MyAppConfig {
//將方法返回的值添加到容器中;容器中這個組件默認(rèn)id就是方法名
@Bean
public HelloService helloService(){
System.out.println("配置類給容器中添加組件");
return new HelloService();
}
}
四昙衅、配置文件的占位符
隨機的占位符
${random.value}
${random.int}
${random.long}
${random.int(10)}
${random.int[1024,65536]}
可以引用在配置文件中配置的其他屬性的值扬霜,如果使用一個沒有在配置文件中的屬性,則會原樣輸出
可以使用 : 指定默認(rèn)值而涉,如果沒有該屬性則使用默認(rèn)值
五著瓶、Profile
Profile是Spring對不同環(huán)境提供不同配置功能的支持,可以通過激活啼县、指定參數(shù)等方式快速切換環(huán)境
1材原、多profile文件形式
文件名格式:application-{profile}.properties/yml,例如:
application-dev.properties
application-prod.properties
2、yml支持多文檔塊方式
每個文檔塊使用---分割
server:
port: 8080
spring:
profiles:
active: prod
---
server:
port: 8081
spring:
profiles: dev
---
server:
port: 8082
spring:
profiles: prod
3子刮、激活指定profile的三種方式
1威酒、在配置文件中指定 spring.profiles.active=dev(如上)
2、項目打包后在用命令行啟動時挺峡,在其命令后面帶上 --spring.profiles.active=dev 即可
java -jar xxxxxxxxx.jar --spring.profiles.active=dev
啟動對比圖
3葵孤、配置虛擬機參數(shù)
-Dspring.profiles.active=dev
image.pngimage.png
4、配置文件加載位置
一級(當(dāng)前項目文件路徑下的config文件夾下) :file: ./config/
二級( 當(dāng)前項目文件路徑下):? file: ./
三級( 類路徑下的config文件夾):? classpath: /config/
四級(類路徑下):? classpath: /
優(yōu)先級由高到底橱赠,高優(yōu)先級的配置會覆蓋低優(yōu)先級的配置尤仍;(優(yōu)先級低的先加載,后續(xù)會被優(yōu)先級高的覆蓋互補)狭姨;
SpringBoot會從這四個位置全部加載主配置文件宰啦;并互補配置!饼拍!
這里需要注意的是赡模,項目根路徑下的配置文件在maven編譯時不會打包過去,需要在pom的build標(biāo)簽中增加以下代碼
<resources>
<resource>
<directory>.</directory>
<filtering>true</filtering>
<includes>
<include>**/*.properties</include>
<include>**/*.yaml</include>
</includes>
</resource>
</resources>
此外還可以通過spring.config.location來改變默認(rèn)的配置文件位置惕耕,(該指定的配置優(yōu)先級最高)
項目打包好以后纺裁,我們可以使用命令行參數(shù)的形式,啟動項目的時候來指定配置文件的新位置;指定配置文件和默認(rèn)加載的這些配置文件共同起作用形成互補配置欺缘;java -jar xxx.jar --spring.config.location=D:/home/cloudlandboy/application.yaml
6栋豫、外部配置加載循序
SpringBoot也可以從以下位置加載配置; 優(yōu)先級從高到低谚殊;高優(yōu)先級的配置覆蓋低優(yōu)先級的配置丧鸯,所有的配置會形成互補配置
-
命令行參數(shù)
所有的配置都可以在命令行上進行指定,多個配置用空格分開嫩絮; --配置項=值
java -jar xxx.jar --server.port=8087 --server.context-path=/abc
2.來自java:comp/env的JNDI屬性
Java系統(tǒng)屬性(System.getProperties())
操作系統(tǒng)環(huán)境變量
RandomValuePropertySource配置的random.*屬性值
優(yōu)先加載帶profile(由jar包從外向內(nèi)進行尋找)
- jar包外部的
application-{profile}.properties
或application.yml
(帶spring.profile)配置文件- jar包內(nèi)部的
application-{profile}.properties
或application.yml
(帶spring.profile)配置文件
再來加載不帶profile(由jar包從外向內(nèi)進行尋找)
- jar包外部的
application.properties
或application.yml
(不帶spring.profile)配置文件- jar包內(nèi)部的
application.properties
或application.yml
(不帶spring.profile)配置文件
- @Configuration注解類上的@PropertySource
- 通過SpringApplication.setDefaultProperties指定的默認(rèn)屬性
所有支持的配置加載來源均可查考官方文檔:官方文檔