springBoot基礎(chǔ)系列-properties配置


原創(chuàng)文章贬墩,轉(zhuǎn)載請標(biāo)注出處:《SpringBoot基礎(chǔ)系列-properties配置》


一蜈膨、概述

SpringBoot中免除了大部分手動配置问潭,但是對于一些特定的情況鸠项,還是需要我們進行手動配置的,SpringBoot為我們提供了application.properties配置文件辅甥,讓我們可以進行自定義配置酝润,來對默認(rèn)的配置進行修改,以適應(yīng)具體的生產(chǎn)情況璃弄,當(dāng)然還包括一些第三方的配置要销。幾乎所有配置都可以寫到application.peroperties文件中,這個文件會被SpringBoot自動加載夏块,免去了我們手動加載的煩惱疏咐。但實際上,很多時候我們卻會自定義配置文件脐供,這些文件就需要我們進行手動加載浑塞,SpringBoot是不會自動識別這些文件的,下面就來仔細(xì)看看這些方面的內(nèi)容政己。

二酌壕、格式

SpringBoot可以識別兩種格式的配置文件,分別是yml文件與properties文件,我們可以將application.properties文件換成application.yml卵牍,這兩個文件都可以被SpringBoot自動識別并加載果港,但是如果是自定義的配置文件,就最好還是使用properties格式的文件糊昙,因為SpringBoot中暫時還并未提供手動加載yml格式文件的功能(這里指注解方式)辛掠。

application.properties配置文件欲被SpringBoot自動加載,需要放置到指定的位置:src/main/resource目錄下释牺,一般自定義的配置文件也位于此目錄之下萝衩。

三、加載

加載的意思就是將文件讀取到Spring容器之中船侧,更確切的說就是將各個配置項裝載到Spring上下文容器之中供隨時取用欠气。

application.properties配置文件是在SpringBoot項目啟動的時候被自動加載的,其內(nèi)部的相關(guān)設(shè)置會自動覆蓋SpringBoot默認(rèn)的對應(yīng)設(shè)置項镜撩,所以的配置項均會保存到Spring容器之中。

  1. 公共配置文件:application.properties
donghao.name=唯一浩哥
donghao.sex=男
donghao.age=80

自定義的xxx.properties配置文件是不會被SpringBoot自動加載的队塘,需要手動去進行加載袁梗,這里的手動加載一般指的是注解的方式加載,這里就涉及到我們今天的重點之一:加載自定義屬性文件的注解:@PropertySource("classpath:xxx.properties")憔古,這個注解專門用來加載指定位置的properties文件遮怜,Spring暫未提供加載指定位置yml文件的注解,所以才有之前的說法鸿市。

  1. 自定義配置文件:donghao.properties
donghao1.name=動畫
donghao1.sex=女
donghao1.age=22

其實無論對于哪里的properties文件锯梁,當(dāng)我們需要使用其中配置內(nèi)容的時候,就在當(dāng)前類的頂部加注該注解焰情,將該配置文件加載到內(nèi)存陌凳,這些配置文件一次加載即可多次使用。但更通用的情況是新建一個配置類内舟,使用@Configuration標(biāo)注合敦,再加上之前的@PropertySource("classpath:xxx.properties")注解,而類的內(nèi)部并不需要任何內(nèi)容验游,這是一個純粹的配置加載類充岛。由于@Configuration的作用(底層為@Component),他會被Spring的掃描器掃到耕蝉,并加載到JVM崔梗,并創(chuàng)建Bean,而創(chuàng)建的時候就會執(zhí)行配置文件中配置項的加載垒在。這種方式加載的配置可以在任何Spring管轄的類中用@Value("${key}")的方式使用蒜魄,見下方介紹。

四、使用

配置項的使用其實很簡單权悟,只要是加載到Spring容器中的配置項都可以直接使用@Value("${key}")的方式來引用砸王,一般將其配置在字段頂部,表示將配置項的值賦值給該字段峦阁。

當(dāng)然更多的情況是將這些配置項與一個JavaBean綁定起來使用谦铃,這樣綁定一次,我們就可以隨時使用榔昔。這里涉及到兩種情況驹闰,一種是將application.properties中的配置與JavaBean綁定,一種是將自定義配置文件中的配置與Javabean綁定撒会。

第一種:applicaiton.properties屬性綁定JavaBean

這種情況相對簡單(因為application.properties文件會被自動加載嘹朗,也就是說配置項會被自動加載到內(nèi)存,到Spring容器之中诵肛,省去了手動加載的配置)屹培,然后我們在要與屬性綁定的JavaBean的類定義頂部加@Component注解和@ConfigurationProperties(prefix="key")注解,前者的目的是為了這個JavaBean可以被SpringBoot項目啟動時候被掃描到并加載到Spring容器之中怔檩,重點是后者褪秀,這個注解一般不是單獨使用的,他一般與后面要說的@EnableConfigurationProperties(JavaBean.class)配合使用薛训,但是二者并非使用在同一位置媒吗,@ConfigurationProperties(prefix="key")注解加注在JavaBean類定義之上,按字面可以理解為屬性配置注解乙埃,更直接點的說法就是屬性綁定注解闸英,官方解釋是:如果想要綁定或者驗證一些來源自.properties文件中的額外屬性時,你可以在一個標(biāo)注的@Configuration的類的注有@Bean注解的方法或者一個類之上加注這個注解介袜。我們完全可以將其理解為綁定專用注解甫何。它的作用就是將指定的前綴的配置項的值與JavaBean的字段綁定,這里要注意米酬,為了綁定的成功沛豌,一般將字段的名稱與配置項鍵的最后一個鍵名相同,這樣整個鍵在去掉前綴的情況下就和字段名稱一致赃额,以此來進行綁定加派。

第二種:自定義配置的屬性綁定JavaBean

這種情況與之前的基本相同,只是不能自動加載跳芳,需要手動加載芍锦,在JavaBean之上加上之前介紹的@PropertySource注解進行配置文件加載。還有一點就是將@Component改為@Configuration飞盆,為什么這么做呢娄琉?

@Configuration注解的底層就是@Component次乓,但是二者意義不同,@Configuration注解側(cè)重配置之意孽水,@Component側(cè)重組件之意票腰,當(dāng)然配置也是項目組件之一,在這里我們要將配置文件屬性與JavaBean綁定女气,當(dāng)然更側(cè)重配置之意杏慰。

將配置與JavaBean綁定之后,我們就可以通過JavaBean來獲取配置的內(nèi)容炼鞠,而且JavaBean已經(jīng)被@Component注解或者@Configuration注解加載到Spring容器缘滥,我們可以使用自動注入的方式在其他類中隨便使用。

這里要注意一點:當(dāng)我們在某個類中要使用這個JavaBean時谒主,需要在這個類中指定這個JavaBean的類型朝扼,這個指定也要使用注解來指定,正是之前介紹的@EnableConfigurationProperties注解霎肯,這個注解與@ConfigurationProperties注解配套使用擎颖。官方給出的解釋:這個注解是對@ConfigurationProperties的有效支持。標(biāo)注有@ConfigurationProperties注解的Beans可以被使用標(biāo)準(zhǔn)的方式注冊(使用@Bean注解)姿现,或者肠仪,為了方便起見,直接用使用@EnableConfigurationProperties指定注冊备典。意思是這個注解提供了一種方便直接的注冊Bean的方式。

  1. 綁定JavaBean:Donghao.java
package com.donghao.model;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

@Configuration
@PropertySource("classpath:donghao.properties")
@ConfigurationProperties(prefix="donghao1")
public class Donghao {
    private String name;
    private String sex;
    private String age;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public String getAge() {
        return age;
    }
    public void setAge(String age) {
        this.age = age;
    }
}
  1. 定義控制器:DonghaoController
package com.donghao.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.donghao.model.Donghao;

@RestController
@RequestMapping("/donghao")
@EnableConfigurationProperties(Donghao.class)
public class DonghaoController {
    
    @Autowired
    Donghao donghao;
    
    @Value("${donghao.name}")
    private String name;
    
    @Value("${donghao.sex}")
    private String sex;
    
    @Value("${donghao.age}")
    private String age;

    
    @RequestMapping("/hello")
    public String hello(){
        return "我的名字叫"+name+",我是"+sex+"生,今年"+age+"歲了!";
    }
    
    @RequestMapping("/ss")
    public String ss(){
        return donghao.getName()+donghao.getSex()+donghao.getAge();
    }
}
  1. 定義啟動入口類:DonghaoApplication.java
package com.donghao;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DonghaoApplication {

    public static void main(String[] args) {
        
        SpringApplication.run(DonghaoApplication.class, args);
        
    }

}

啟動程序之后意述,瀏覽器訪問:http://localhost:8080/donghao/hello提佣,結(jié)果為:

瀏覽器訪問:http://localhost:8080/donghao/ss

我這里要重點強調(diào)一點,加載和使用并不相關(guān)聯(lián)荤崇,雖然加載的目的是為了使用拌屏,但是加載和使用之間并不是強關(guān)聯(lián)的,我們完全可以加載但不使用术荤,所以我們應(yīng)該將加載的過程與使用的過程分開來分析倚喂,它們對應(yīng)于不同的注解,這些注解之間也不是強關(guān)聯(lián)的瓣戚,他們各有各的用途端圈,如果只是加載自定義配置文件,只要一個@PropertySource注解就完事子库,使用方面的注解不用去管舱权,當(dāng)需要使用的時候,我們完全可以選擇多種使用的方式仑嗅,直接使用的話我們就使用@Value注解進行直接賦值宴倍,這個注解就可以直接將被加載到Spring容器中(environment)的屬性配置的值賦值到指定的字段张症,當(dāng)然也可以使用綁定JavaBean的方式。

還有一點要注意鸵贬,千萬不要在公共配置文件application.properties和自定義配置文件xxx.properties中配置相同的的配置項的不同值俗他,因為公共配置文件的優(yōu)先權(quán)最高,會覆蓋掉自定義配置文件中的內(nèi)容阔逼,你可以這么理解兆衅,公共配置文件中的某個配置被在啟動時加載到Spring容器中,之后又在另外一個自定義配置文件中加載了同名的配置項颜价,二者有不同的值涯保,但是系統(tǒng)會檢查二者的優(yōu)先權(quán),誰高誰留周伦,誰低誰走夕春,最后自定義配置文件中的值無效。

有些時候我們需要定義一些靜態(tài)的字段(變量)专挪,也想使用這種方式實現(xiàn)值的注入及志,但是發(fā)現(xiàn)注入不進去,原因何在呢寨腔?這需要對值注入的原理有些了解速侈,值的注入和屬性的注入類似,都是基于set方法實現(xiàn)的迫卢,那么就簡單了倚搬,我們只要針對靜態(tài)變量添加set方法即可,但是添加之后發(fā)現(xiàn)還是不好使乾蛤,因為我們還需要將Value注解轉(zhuǎn)移到set方法上來每界,這樣就可以實現(xiàn)注入了。set方法的寫法可以與普通變量的寫法相同家卖,用this調(diào)用眨层,也可以直接類名點用。

比如:我們在applicaiton.properties中添加:

huahua=123321

然后在DonghaoController中添加如下代碼:

private static String huahua;

    @Value("${huahua}")
    public void setHuahua(String huahua){
//        this.huahua = huahua;
        DonghaoController.huahua = huahua;
    }

    @RequestMapping("/hh")
    public String hh(){
        return "新的測試"+ huahua;
    }

上面的兩種寫法均可實現(xiàn)目標(biāo)上荡。

如此施為趴樱,即可實現(xiàn)靜態(tài)變量的值注入。

瀏覽器訪問:http://localhost:8080/donghao/hh

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末酪捡,一起剝皮案震驚了整個濱河市叁征,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌沛善,老刑警劉巖航揉,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異金刁,居然都是意外死亡帅涂,警方通過查閱死者的電腦和手機议薪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來媳友,“玉大人斯议,你說我怎么就攤上這事〈济” “怎么了哼御?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長焊唬。 經(jīng)常有香客問我恋昼,道長,這世上最難降的妖魔是什么赶促? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任液肌,我火速辦了婚禮,結(jié)果婚禮上鸥滨,老公的妹妹穿的比我還像新娘嗦哆。我一直安慰自己,他們只是感情好婿滓,可當(dāng)我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布老速。 她就那樣靜靜地躺著,像睡著了一般凸主。 火紅的嫁衣襯著肌膚如雪橘券。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天卿吐,我揣著相機與錄音约郁,去河邊找鬼。 笑死但两,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的供置。 我是一名探鬼主播谨湘,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼芥丧!你這毒婦竟也來了紧阔?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤续担,失蹤者是張志新(化名)和其女友劉穎擅耽,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體物遇,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡乖仇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年憾儒,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片乃沙。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡起趾,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出警儒,到底是詐尸還是另有隱情训裆,我是刑警寧澤,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布蜀铲,位于F島的核電站边琉,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏记劝。R本人自食惡果不足惜变姨,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望隆夯。 院中可真熱鬧钳恕,春花似錦、人聲如沸蹄衷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽愧口。三九已至睦番,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間耍属,已是汗流浹背托嚣。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留厚骗,地道東北人示启。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像领舰,于是被迫代替她去往敵國和親夫嗓。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,514評論 2 348