SpringBoot配置文件(三)

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)不用加上單引號或者雙引號;

  1. " ":雙引號浙滤;不會轉(zhuǎn)義字符串里面的特殊字符阴挣;特殊字符會作為本身想表示的意思
    name: "測試1 \n 測試2":
    輸出:測試1 (換行再輸出) 測試2
  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é)果如下


image.png

結(jié)果2

測試中用properties配置文件的寫法會出現(xiàn)中文會亂碼干奢,而且char類型還會拋出Failed to bind properties under 'person.gender' to java.lang.Character異常


image.png

中文亂碼解決方法

在設(shè)置中找到File Encodings痊焊,將配置文件字符集改為UTF-8,并勾選:Transparent native-to-ascii conversion


英文版
中文版

三忿峻、配置文件值注入兩種方式對比

配置文件值注入有兩種方式:
一個是上面提到的Spring Boot的@ConfigurationProperties注解
一個是spring原先的@value注解

兩種功能的比較


image.png

松散綁定:例如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ù)組停团,也就是可以加載多個配置文件

springboot默認(rèn)加載的配置文件名是application,如果配置文件名不是這個是不會被容器加載的掏熬,所以這里Person并沒有被注入任何屬性值
image.png

使用@PropertySource({"classpath:person.properties"})指定加載person.properties配置文件
需要指定加載多個配置文件時{"classpath:person.properties"佑稠,"classpath:person.properties"}

image.png

使用這個注解加載配置文件就需要配置類使用@component等注解而不是等待@EnableConfigurationProperties激活,而且不支持yaml旗芬,只能是properties

2舌胶、@ImportResource

@ImportResource:用于導(dǎo)入Spring的配置文件,讓配置文件里面的內(nèi)容生效疮丛;(就是以前寫的springmvc.xml幔嫂、applicationContext.xml)

Spring Boot里面沒有Spring的配置文件辆它,我們自己編寫的配置文件,也不能自動識別履恩;
image.png

想讓自己寫的Spring的配置文件生效加載進來锰茉;就需要吧@ImportResource標(biāo)注在一個配置類上
image.png

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)值


占位符默認(rèn)值

五著瓶、Profile

Profile是Spring對不同環(huán)境提供不同配置功能的支持,可以通過激活啼县、指定參數(shù)等方式快速切換環(huán)境

1材原、多profile文件形式

文件名格式:application-{profile}.properties/yml,例如:

application-dev.properties
application-prod.properties


樣例

程序啟動時會默認(rèn)加載application.properties季眷,啟動的端口就是8080余蟹,可以在主配置文件中指定激活哪個配置文件
激活dev環(huán)境配置
2、yml支持多文檔塊方式

每個文檔塊使用---分割

server:
  port: 8080
spring:
  profiles:
    active: prod
---
server:
  port: 8081
spring:
  profiles: dev
---
server:
  port: 8082
spring:
  profiles: prod
image.png
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.png
image.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會從這四個位置全部加載主配置文件宰啦;并互補配置!饼拍!

image.png

這里需要注意的是赡模,項目根路徑下的配置文件在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)先級的配置丧鸯,所有的配置會形成互補配置

  1. 命令行參數(shù)

    所有的配置都可以在命令行上進行指定,多個配置用空格分開嫩絮; --配置項=值

    java -jar xxx.jar --server.port=8087  --server.context-path=/abc
    

2.來自java:comp/env的JNDI屬性

  1. Java系統(tǒng)屬性(System.getProperties())

  2. 操作系統(tǒng)環(huán)境變量

  3. RandomValuePropertySource配置的random.*屬性值

優(yōu)先加載帶profile(由jar包從外向內(nèi)進行尋找)

  1. jar包外部的application-{profile}.propertiesapplication.yml(帶spring.profile)配置文件
  2. jar包內(nèi)部的application-{profile}.propertiesapplication.yml(帶spring.profile)配置文件

再來加載不帶profile(由jar包從外向內(nèi)進行尋找)

  1. jar包外部的application.propertiesapplication.yml(不帶spring.profile)配置文件
  2. jar包內(nèi)部的application.propertiesapplication.yml(不帶spring.profile)配置文件
image.png
  1. @Configuration注解類上的@PropertySource
  2. 通過SpringApplication.setDefaultProperties指定的默認(rèn)屬性

所有支持的配置加載來源均可查考官方文檔:官方文檔

image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末丛肢,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子剿干,更是在濱河造成了極大的恐慌蜂怎,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件置尔,死亡現(xiàn)場離奇詭異杠步,居然都是意外死亡,警方通過查閱死者的電腦和手機榜轿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進店門幽歼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人谬盐,你說我怎么就攤上這事甸私。” “怎么了飞傀?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵皇型,是天一觀的道長。 經(jīng)常有香客問我助析,道長犀被,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任外冀,我火速辦了婚禮,結(jié)果婚禮上掀泳,老公的妹妹穿的比我還像新娘雪隧。我一直安慰自己,他們只是感情好员舵,可當(dāng)我...
    茶點故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布脑沿。 她就那樣靜靜地躺著,像睡著了一般马僻。 火紅的嫁衣襯著肌膚如雪庄拇。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天,我揣著相機與錄音措近,去河邊找鬼溶弟。 笑死,一個胖子當(dāng)著我的面吹牛瞭郑,可吹牛的內(nèi)容都是我干的辜御。 我是一名探鬼主播,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼屈张,長吁一口氣:“原來是場噩夢啊……” “哼擒权!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起阁谆,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤碳抄,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后场绿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體纳鼎,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年裳凸,在試婚紗的時候發(fā)現(xiàn)自己被綠了贱鄙。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡姨谷,死狀恐怖逗宁,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情梦湘,我是刑警寧澤瞎颗,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站捌议,受9級特大地震影響哼拔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜瓣颅,卻給世界環(huán)境...
    茶點故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一倦逐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧宫补,春花似錦檬姥、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至贫贝,卻和暖如春秉犹,著一層夾襖步出監(jiān)牢的瞬間蛉谜,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工崇堵, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留型诚,地道東北人。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓筑辨,卻偏偏與公主長得像俺驶,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子棍辕,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,884評論 2 354

推薦閱讀更多精彩內(nèi)容