### 1.5 全局配置文件
全局配置文件能夠?qū)σ恍┠J(rèn)配置值進(jìn)行修改傅蹂。Spring Boot使用一個application.properties或者application.yaml的文件作為全局配置文件买窟,該文件存放在src/main/resource目錄或者類路徑的/config裆悄,一般會選擇resource目錄吼拥。接下來但校,將針對這兩種全局配置文件進(jìn)行講解 :
#### 1.5.1 application.properties配置文件
使用Spring Initializr方式構(gòu)建Spring Boot項目時,會在resource目錄下自動生成一個空的application.properties文件枷踏,Spring Boot項目啟動時會自動加載application.properties文件菩暗。
我們可以在application.properties文件中定義Spring Boot項目的相關(guān)屬性,當(dāng)然旭蠕,這些相關(guān)屬性可以是系統(tǒng)屬性停团、環(huán)境變量、命令參數(shù)等信息掏熬,也可以是自定義配置文件名稱和位置?
```properties
server.port=8081
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.config.additional-location=
spring.config.location=
spring.config.name=application
```
接下來佑稠,通過一個案例對Spring Boot項目中application.properties配置文件的具體使用進(jìn)行講解?
演示:
預(yù)先準(zhǔn)備了兩個實體類文件,后續(xù)會演示將application.properties配置文件中的自定義配置屬性注入到Person實體類的對應(yīng)屬性中
(1)先在項目的com.lagou包下創(chuàng)建一個pojo包旗芬,并在該包下創(chuàng)建兩個實體類Pet和Person?
```java
public class Pet {
private String type;
private String name;
// 省略屬性getXX()和setXX()方法
// 省略toString()方法
}
```
```java
@Component? ? //用于將Person類作為Bean注入到Spring容器中
@ConfigurationProperties(prefix =
"person") //將配置文件中以person開頭的屬性注入到該類中
public class Person {
private int id;? ? ? ? ? ? //id
? ? ? private String name;? ? ? //名稱
? ? ? private List hobby;? ? ? //愛好
? ? ? private String[] family; //家庭成員
? ? ? private Map map;
? ? ? private Pet pet;? ? ? ? ? //寵物
// 省略屬性getXX()和setXX()方法
// 省略toString()方法
}
```
@ConfigurationProperties(prefix =
"person")注解的作用是將配置文件中以person開頭的屬性值通過setXX()方法注入到實體類對應(yīng)屬性中
@Component注解的作用是將當(dāng)前注入屬性值的Person類對象作為Bean組件放到Spring容器中舌胶,只有這樣才能被@ConfigurationProperties注解進(jìn)行賦值
(2)打開項目的resources目錄下的application.properties配置文件,在該配置文件中編寫需要對Person類設(shè)置的配置屬性
<img
src="./images/image-20191225151413976.png"
alt="image-20191225151413976" style="zoom:67%;" />
?? ? ? ?
編寫application.properties配置文件時岗屏,由于要配置的Person對象屬性是我們自定義的辆琅,Spring Boot無法自動識別漱办,所以不會有任何書寫提示这刷。在實際開發(fā)中,為了出現(xiàn)代碼提示的效果來方便配置娩井,在使用@ConfigurationProperties注解進(jìn)行配置文件屬性值注入時暇屋,可以在pom.xml文件中添加一個Spring Boot提供的配置處理器依賴:
```xml
<dependency>
? ? ? <groupId>org.springframework.boot</groupId>
? ? ? <artifactId>spring-boot-configuration-processor</artifactId>
? ? ? <optional>true</optional>
</dependency>
```
?? ? ? ?
在pom.xml中添加上述配置依賴后,還需要重新運行項目啟動類或者使用“Ctrl+F9”快捷鍵(即Build Project)重構(gòu)當(dāng)前Spring Boot項目方可生效?
(3)查看application.properties配置文件是否正確洞辣,同時查看屬性配置效果咐刨,打開通過IDEA工具創(chuàng)建的項目測試類,在該測試類中引入Person實體類Bean扬霜,并進(jìn)行輸出測試
```java
@RunWith(SpringRunner.class) // 測試啟動器定鸟,并加載Spring Boot測試注解
@SpringBootTest? // 標(biāo)記為Spring Boot單元測試類,并加載項目的ApplicationContext上下文環(huán)境
class SpringbootDemoApplicationTests {
// 配置測試
@Autowired
private Person person;
@Test
void
configurationTest() {
System.out.println(person);
}
}
```
打印結(jié)果:
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-AXAss9bW-1591587012851)(./images/image-20191225152040345.png)]
可以看出著瓶,測試方法configurationTest()運行成功联予,同時正確打印出了Person實體類對象。至此,說明application.properties配置文件屬性配置正確沸久,并通過相關(guān)注解自動完成了屬性注入?
#### 1.5.2
application.yaml配置文件?
YAML文件格式是Spring
Boot支持的一種JSON超集文件格式季眷,相較于傳統(tǒng)的Properties配置文件,YAML文件以數(shù)據(jù)為核心卷胯,是一種更為直觀且容易被電腦識別的數(shù)據(jù)序列化格式子刮。application.yaml配置文件的工作原理和application.properties是一樣的,只不過yaml格式配置文件看起來更簡潔一些窑睁。
* YAML文件的擴(kuò)展名可以使用.yml或者.yaml挺峡。
* application.yml文件使用 “key:(空格)value”格式配置屬性,使用縮進(jìn)控制層級關(guān)系担钮。
這里沙郭,針對不同數(shù)據(jù)類型的屬性值,介紹一下YAML
(1)value值為普通數(shù)據(jù)類型(例如數(shù)字裳朋、字符串病线、布爾等)?
?? ? ? ?
當(dāng)YAML配置文件中配置的屬性值為普通數(shù)據(jù)類型時,可以直接配置對應(yīng)的屬性值鲤嫡,同時對于字符串類型的屬性值送挑,不需要額外添加引號,示例代碼如下?
```yaml
server:
port: 8081
path: /hello
```
?? ? ?
上述代碼用于配置server的port和path屬性暖眼,port和path屬于一個級別?
(2)value值為數(shù)組和單列集合
當(dāng)YAML配置文件中配置的屬性值為數(shù)組或單列集合類型時惕耕,主要有兩種書寫方式:縮進(jìn)式寫法和行內(nèi)式寫法。
其中诫肠,縮進(jìn)式寫法還有兩種表示形式司澎,示例代碼如下
```yaml
person:
hobby:
? ? -
play
? ? -
read
? ? -
sleep
```
?? ?
或者使用如下示例形式
```yaml
person:
hobby:
play,
read,
sleep
```
上述代碼中,在YAML配置文件中通過兩種縮進(jìn)式寫法對person對象的單列集合(或數(shù)組)類型的愛好hobby賦值為play栋豫、read和sleep挤安。其中一種形式為“-(空格)屬性值”,另一種形式為多個屬性值之前加英文逗號分隔(注意丧鸯,最后一個屬性值后不要加逗號)蛤铜。
```yaml
person:
hobby: [play,read,sleep]
```
?? ? ? ?
通過上述示例對比發(fā)現(xiàn),YAML配置文件的行內(nèi)式寫法更加簡明丛肢、方便围肥。另外,包含屬性值的中括號“[]”還可以進(jìn)一步省略蜂怎,在進(jìn)行屬性賦值時穆刻,程序會自動匹配和校對?
(3)value值為Map集合和對象
當(dāng)YAML配置文件中配置的屬性值為Map集合或?qū)ο箢愋蜁r,YAML配置文件格式同樣可以分為兩種書寫方式:縮進(jìn)式寫法和行內(nèi)式寫法杠步。
其中氢伟,縮進(jìn)式寫法的示例代碼如下
```yaml
person:
map:
k1: v1
k2: v2
```
對應(yīng)的行內(nèi)式寫法示例代碼如下?
```yaml
person:
map: {k1: v1,k2: v2}
```
在YAML配置文件中撰洗,配置的屬性值為Map集合或?qū)ο箢愋蜁r,縮進(jìn)式寫法的形式按照YAML文件格式編寫即可腐芍,而行內(nèi)式寫法的屬性值要用大括號“{}”包含差导。
接下來,在Properties配置文件演示案例基礎(chǔ)上猪勇,通過配置application.yaml配置文件對Person對象進(jìn)行賦值设褐,具體使用如下?
(1)在項目的resources目錄下,新建一個application.yaml配置文件泣刹,在該配置文件中編寫為Person類設(shè)置的配置屬性
```yaml
#對實體類對象Person進(jìn)行屬性配置
person:
? id:
1
name: lucy
hobby: [吃飯助析,睡覺,打豆豆]
family: [father,mother]
map: {k1: v1,k2: v2}
pet: {type: dog,name: 旺財}
```
(2)再次執(zhí)行測試
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-f8IUbYnF-1591587012854)(./images/image-20191225154330740.png)]
可以看出椅您,測試方法configurationTest()同樣運行成功外冀,并正確打印出了Person實體類對象。
需要**說明**的是掀泳,本次使用application.yaml配置文件進(jìn)行測試時需要提前將application.properties配置文件中編寫的配置注釋雪隧,這是因為application.properties配置文件會覆蓋application.yaml配置文件.
***學(xué)習(xí)讓人快樂,學(xué)習(xí)更讓人覺得無知员舵!學(xué)了1個多月的《Java工程師高薪訓(xùn)練營》脑沿,才發(fā)現(xiàn)自己對每個技術(shù)點的認(rèn)知都很膚淺,根本深不下去马僻,立個Flag:每天堅持學(xué)習(xí)一小時庄拇,一周回答網(wǎng)上3個技術(shù)問題,把自己知道都分享出來韭邓。***