獲取Spring當(dāng)前配置的兩種方式
獲取配置名稱(chēng)的2種方式
- 通過(guò)@Value注解獲取
- 通過(guò)
Environment
類(lèi)獲取
代碼示例如下
package org.example.config; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.EnvironmentAware; import org.springframework.context.annotation.Configuration; import org.springframework.core.env.Environment; @Configuration @Slf4j public class Config1 implements InitializingBean, EnvironmentAware { // 如果沒(méi)有配置會(huì)報(bào)錯(cuò),所以必須指定默認(rèn)值 @Value("${spring.profiles.active:''}") private String envName; @Value("${spring.application.name:''}") private String appName; private Environment environment; // 使用注入的方式也可以獲取到 Environment 對(duì)象 //@Resource //private Environment environment2; @Override public void afterPropertiesSet() throws Exception { log.info("[環(huán)境名稱(chēng)]通過(guò)Value注解獲取 = {}", envName); log.info("[應(yīng)用名稱(chēng)]通過(guò)Value注解獲取 = {}", appName); String property = environment.getProperty("spring.application.name"); log.info("[應(yīng)用名稱(chēng)]通過(guò)environment獲取 = {}", property); String[] activeProfiles = environment.getActiveProfiles(); String[] defaultProfiles = environment.getDefaultProfiles(); if (activeProfiles.length > 0) { log.info("[環(huán)境名稱(chēng)]通過(guò)environment獲取 = {}", activeProfiles[0]); } else { log.info("[activeProfiles為空]"); } if (defaultProfiles.length > 0) { log.info("[環(huán)境名稱(chēng)]通過(guò)environment獲取 = {}", defaultProfiles[0]); } else { log.info("defaultProfiles為空"); } } @Override public void setEnvironment(Environment environment) { this.environment = environment; } }
運(yùn)行Application
@SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
可以得到如下結(jié)果
[環(huán)境名稱(chēng)]通過(guò)Value注解獲取 = ''
[應(yīng)用名稱(chēng)]通過(guò)Value注解獲取 = spring-profiles-test-default
[應(yīng)用名稱(chēng)]通過(guò)environment獲取 = spring-profiles-test-default
[activeProfiles為空]
[環(huán)境名稱(chēng)]通過(guò)environment獲取 = default
注意
默認(rèn)啟動(dòng)應(yīng)用時(shí),我們并未顯式的指定任何profiles名稱(chēng)。這是Spring默認(rèn)是default。如果使用@Profile
注解激活需要這樣使用
@Profile({"default"})
需要注意的是,默認(rèn)啟動(dòng)應(yīng)用時(shí)。使用@Value("${spring.profiles.active}")
這種方式并不能獲取到環(huán)境的名稱(chēng),因?yàn)槲覀儧](méi)有在任何地方定義spring.profiles.active這個(gè)變量。所以需要指定默認(rèn)值,否則會(huì)報(bào)錯(cuò)。
思考
思考:哪些應(yīng)用場(chǎng)景下,我們需要獲取當(dāng)前配置的名稱(chēng)。
- 某段代碼不想放到生產(chǎn)環(huán)境中,但在測(cè)試環(huán)境由于某些原因又必須需要(比如方便快速定位bug等原因)
- 開(kāi)發(fā)一款插件,對(duì)外提供高度定制化的配置項(xiàng)
假如我們要開(kāi)發(fā)一款插件(或者別的項(xiàng)目),打包成jar包放到maven倉(cāng)庫(kù)供全網(wǎng)程序猿使用。比如pagehelper
這樣有修改的插件。那插件中一定會(huì)暴露出很多配置項(xiàng)供開(kāi)發(fā)者選擇。假設(shè)我們現(xiàn)在有一個(gè)需求,這個(gè)插件只能在非生產(chǎn)環(huán)境運(yùn)行。該怎么辦呢?解決思路其實(shí)很簡(jiǎn)單,就是動(dòng)態(tài)配置。
動(dòng)態(tài)配置
如何做到動(dòng)態(tài)配置呢。比如這里我開(kāi)發(fā)一個(gè)插件是ibatistools,我們可以預(yù)留一個(gè)配置項(xiàng)activeEnv
——表示在哪些環(huán)境下可以激活,這樣我們就可以讀取application.yml
來(lái)獲取activeEnv
的值。
到此這篇關(guān)于獲取Spring當(dāng)前配置的兩種方式的文章就介紹到這了,更多相關(guān)獲取Spring當(dāng)前配置內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot結(jié)合mysql主從來(lái)實(shí)現(xiàn)讀寫(xiě)分離的方法示例
這篇文章主要介紹了springboot結(jié)合mysql主從來(lái)實(shí)現(xiàn)讀寫(xiě)分離的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04SpringBoot搭建Dubbo項(xiàng)目實(shí)現(xiàn)斐波那契第n項(xiàng)詳解
這篇文章主要講解了“SpringBoot+Dubbo怎么實(shí)現(xiàn)斐波那契第N項(xiàng)”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)吧2022-06-06淺談ArrayList和LinkedList到底誰(shuí)更快
今天給大家?guī)?lái)的是關(guān)于Java的相關(guān)知識(shí),文章圍繞著ArrayList和LinkedList到底誰(shuí)更快展開(kāi),文中有非常詳細(xì)的介紹,需要的朋友可以參考下2021-06-06Spring擴(kuò)展BeanFactoryPostProcessor使用技巧詳解
這篇文章主要為大家介紹了Spring擴(kuò)展BeanFactoryPostProcessor使用技巧詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09詳解Struts2中json 相互引用死循環(huán)解決辦法
本篇文章主要介紹詳解Struts2中json 相互引用死循環(huán)解決辦法,具有一定的參考價(jià)值,有興趣的可以了解一下。2017-01-01java IO流 之 輸出流 OutputString()的使用
這篇文章主要介紹了java IO流 之 輸出流 OutputString()的使用的相關(guān)資料,需要的朋友可以參考下2016-12-12