第三章 資源注入

在日常開發(fā)中我們有一些配置是不能寫死在代碼里的廉白,因為他們有變化的可能。比如服務地址乖菱,dev坡锡,test,pre 窒所,product 每個環(huán)境的地址肯定都是不一致的鹉勒。而這些變量我們怎么來處理呢。就是將其定義到properties文件中吵取。

配置定義

spring boot 支持2種類型的配置文件禽额。

properties

properties為鍵值對的配置方式,沒有層級關系皮官,一個key 對應一個value脯倒;
示例

spring.application.name=hello-world
spring.application.index=${random.int}

yml

yml是一種有層級結構的書寫配置文件的方式
示例

spring:
  application:
    name: hello-world
    index: ${random.int}

雖然yml看上去優(yōu)雅一點,但是如果層級關系過多,可讀性下降的會比較快捺氢。注意使用yml配置 “:” 后邊必須有一個空格.

配置取值

value注解

@Value(value = "${spring.application.name}")
@Value(value = "${spring.application.index:0}")
@Value(value = "#{'${spring.application.name}'.length()}")

${spring.application.name} 這種配置方式要求程序在啟動時必須能獲取到這個配置信息藻丢。一般是properties或者yml文件中必須要有該配置,當然其他配置位置也行摄乒。
${spring.application.index:0} 相對于上面的配置方式就是給屬性設置了一個默認值悠反,即:后面的值,這樣程序啟動就不會報錯缺狠,而是使用默認值问慎。使用該方式要一定要小心,因為有將默認值得發(fā)布至生產環(huán)境的可能挤茄。
#{'${spring.application.name}'.length()} #后面是一個表達式如叼,可以給屬性注入一個表達式的結果。

ConfigurationProperties注解

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix = "spring.application")
public class ApplicationConfig {
    private String name;
    private int index;
    private int appNameLength;


    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getIndex() {
        return index;
    }

    public void setIndex(int index) {
        this.index = index;
    }

    public int getAppNameLength(){
        return this.name.length();
    }
}

@ConfigurationProperties(prefix = "spring.application") 用這個注解能抽象出一個類穷劈。完成屬性的注入笼恰。這樣在需要使用該配置時使用@Autowired注解獲得該對象踊沸。

ps:這兩種方式都能完成資源的注入那我們怎么選擇呢?我的建議是社证,如果這個配置僅在1個類中使用時使用Value注解進行逼龟,如果這個配置在多個類中使用使用ConfigurationProperties注解。保證如果要變更1個配置名只修改1個位置追葡。減少出錯的可能腺律。

各個環(huán)境激活

上面說過我們把這些信息抽象成配置就是因為這些東西可能隨著環(huán)境不同的變化而變化。那我們怎么選擇適當的環(huán)境呢宜肉。
首先我們根據不同的環(huán)境建立多個配置文件匀钧。如圖


image.png

以dev為例

spring.application.name=hello-world-dev
spring.application.index=${random.int}

里面配置的是該環(huán)境下的配置信息。我們在啟動程序的時候使用啟動參數來決定使用那套配置谬返。

java -jar hello-wrold-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev

如果我們本地調試要怎么切換環(huán)境呢之斯。
1.在文件中 application.properties 增加 spring.profiles.active=dev 配置
2.修改idea Run/Debug Configurations 如圖

image.png

如果使用2方法,還可以設置VM options 來進行設置遣铝。但是設置方式是 -Dspring.profiles.active=dev 而不是--
如果對應到啟動命令為

java -jar -Dspring.profiles.active=dev  hello-wrold-0.0.1-SNAPSHOT.jar 

因為設置的是jvm 的參數所有要跟在java 后面佑刷。

隨機數配置

my.secret=${random.value}
my.number=${random.int}
my.bignumber=${random.long}
my.uuid=${random.uuid}
my.number.less.than.ten=${random.int(10)}
my.number.in.range=${random.int[1024,65536]}

配置獲取方式及其優(yōu)先級

1.Devtools global settings properties on your home directory (~/.spring-boot-devtools.properties when devtools is active).
2.@TestPropertySource annotations on your tests.
3.@SpringBootTest#properties annotation attribute on your tests.
4.Command line arguments.
5.Properties from SPRING_APPLICATION_JSON (inline JSON embedded in an environment variable or system property).
6.ServletConfig init parameters.
7.ServletContext init parameters.
8.JNDI attributes from java:comp/env.
9.Java System properties (System.getProperties()).
10.OS environment variables.
11.A RandomValuePropertySource that has properties only in random.*.
12.Profile-specific application properties outside of your packaged jar (application-{profile}.properties and YAML variants).
13.Profile-specific application properties packaged inside your jar (application-{profile}.properties and YAML variants).
14.Application properties outside of your packaged jar (application.properties and YAML variants).
15.Application properties packaged inside your jar (application.properties and YAML variants).
16.@PropertySource annotations on your @Configuration classes.
17.Default properties (specified by setting SpringApplication.setDefaultProperties).

優(yōu)先級是由高到低。其實這中間大多數我們都不常用酿炸,在日常工作中最主要的是4.命令行參數瘫絮,10系統(tǒng)環(huán)境變量。 12.外部application-{profile}.properties配置文件梁沧,13.application-{profile}.properties 內部配置文件檀何。

結果演示

image.png

示例代碼:https://github.com/tong467/hello-wrold
參考文獻:https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-external-config-random-values

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市廷支,隨后出現的幾起案子频鉴,更是在濱河造成了極大的恐慌,老刑警劉巖恋拍,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件垛孔,死亡現場離奇詭異,居然都是意外死亡施敢,警方通過查閱死者的電腦和手機周荐,發(fā)現死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來僵娃,“玉大人概作,你說我怎么就攤上這事∧梗” “怎么了讯榕?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我愚屁,道長济竹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任霎槐,我火速辦了婚禮送浊,結果婚禮上,老公的妹妹穿的比我還像新娘丘跌。我一直安慰自己袭景,他們只是感情好,可當我...
    茶點故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布碍岔。 她就那樣靜靜地躺著浴讯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蔼啦。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天仰猖,我揣著相機與錄音捏肢,去河邊找鬼。 笑死饥侵,一個胖子當著我的面吹牛鸵赫,可吹牛的內容都是我干的。 我是一名探鬼主播躏升,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼辩棒,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了膨疏?” 一聲冷哼從身側響起一睁,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎佃却,沒想到半個月后者吁,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡饲帅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年复凳,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片灶泵。...
    茶點故事閱讀 38,747評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡育八,死狀恐怖,靈堂內的尸體忽然破棺而出赦邻,到底是詐尸還是另有隱情髓棋,我是刑警寧澤,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布深纲,位于F島的核電站仲锄,受9級特大地震影響劲妙,放射性物質發(fā)生泄漏。R本人自食惡果不足惜儒喊,卻給世界環(huán)境...
    茶點故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一镣奋、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧怀愧,春花似錦侨颈、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至扛拨,卻和暖如春耘分,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背绑警。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工求泰, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人计盒。 一個月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓渴频,卻偏偏與公主長得像,于是被迫代替她去往敵國和親北启。 傳聞我的和親對象是個殘疾皇子卜朗,可洞房花燭夜當晚...
    茶點故事閱讀 43,658評論 2 350

推薦閱讀更多精彩內容