<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
Environment的中文意思是環境,它表示整個spring應用執行時的環境資訊,它包含兩個關鍵因素
profiles這個概念相信大家都已經理解了,最常見的就是不同環境下,決定當前spring容器中的不同設定上下文的解決方案。比如針對開發環境、測試環境、生產環境,構建不同的application.properties設定項,這個時候我們可以通過profiles這個屬性來決定當前spring應用上下文中生效的設定項。
實際上,通過profiles可以針對bean的設定進行邏輯分組。 簡單來說,我們可以通過profiles來針對不同的bean進行邏輯分組,這個分組和bean本身的定義沒有任何關係,無論是xml還是註解方式,都可以設定bean屬於哪一個profile分組。
當存在多個profile分組時,我們可以指定哪一個profile生效,當然如果不指定,spring會根據預設的profile去執行。我們來通過一個程式碼演示一下。
建立一個普通的類,程式碼如下
public class ProfileService { private String profile; public ProfileService(String profile) { this.profile = profile; } @Override public String toString() { return "ProfileService{" + "profile='" + profile + ''' + '}'; } }
在設定類中,構建兩個bean,設定不同的profile。
@Configuration public class ProfileConfiguration { @Bean @Profile("dev") public ProfileService profileServiceDev(){ return new ProfileService("dev"); } @Bean @Profile("prod") public ProfileService profileServiceProd(){ return new ProfileService("prod"); } }
public class ProfileMain { public static void main(String[] args) { AnnotationConfigApplicationContext applicationContext=new AnnotationConfigApplicationContext(); // applicationContext.getEnvironment().setActiveProfiles("prod"); applicationContext.register(ProfileConfiguration.class); applicationContext.refresh(); System.out.println(applicationContext.getBean(ProfileService.class)); } }
可以通過很多種方式來啟用設定,預設情況下不新增applicationContext.getEnvironment().setActiveProfiles("prod");
時,會發現bean沒有被裝載。新增了之後,會根據當前啟用的profiles來決定裝載哪個bean。
除此之外,我們還可以在啟動引數中增加-Dspring.profiles.active=prod
來決定當前啟用哪個profile。該屬性可以設定在系統環境變數、JVM系統屬性、等。
注意組態檔不是單選;可能會同時啟用多個組態檔,程式設計式的使用方法setActiveProfiles(),該方法接收String陣列引數,也就是多個組態檔名
applicationContext.getEnvironment().setActiveProfiles("prod","dev");
如果沒有任何profile設定被啟用,預設的profile將會啟用。 預設profile組態檔可以更改,通過環境變數的setDefaultProfiles方法,或者是宣告的spring.profiles.default屬性值
簡單總結一下profiles,通過profiles可以最一組bean進行邏輯分組,這些邏輯分組的bean會根據Environment上下文中設定的啟用的profile來進行載入,也就是Environment對於profiles設定來說,它能決定當前啟用的是哪個profile設定。
properties的作用就是用來存放屬性的,它可以幫我們管理各種設定資訊。這個設定的來源可以是properties檔案、JVM properties、系統環境變數、或者專門的Properties物件等。
我們來看一下Environment這個介面,它繼承了PropertyResolver,這個介面和屬性的操作有關,也就是我們可以通過Environment來設定和獲得相關屬性。
public interface Environment extends PropertyResolver { String[] getActiveProfiles(); String[] getDefaultProfiles(); /** @deprecated */ @Deprecated boolean acceptsProfiles(String... var1); boolean acceptsProfiles(Profiles var1); }
至此,我們可以可以簡單的總結Environment的作用,Environment提供了不同的profile設定,而PropertyResolver提供了設定的操作,由此我們可以知道,Spring 容器可以根據不同的profile來獲取不同的設定資訊,從而實現Spring容器中執行時環境的處理。
在spring boot應用中,修改application.properties設定
env=default
建立一個Controller進行測試
@RestController public class EnvironementController { @Autowired Environment environment; @GetMapping("/env") public String env(){ return environment.getProperty("env"); } }
在前面的內容中我們介紹了profile和property這兩個概念,現在我們來結合使用加深對這兩者的理解。
在spring boot應用中,預設的外部化設定是application.properties檔案,事實上,除了這個預設的組態檔之外,我們還可以使用springboot中的約定命名格式來實現不同環境的設定
application-profile.properties
當前spring boot應用選擇使用哪個properties檔案作為上下文環境設定,取決與當前啟用的profile。同樣,我們可以通過很多種方式來啟用,比如在application.properties中增加spring.profiles.active=dev
這種方式,也可以在JVM引數中增加該設定來指定生效的設定。
在不指定的情況下,則使用預設的組態檔,簡單來說,如果沒有顯式啟用某一個組態檔,那麼應用程式就將載入application-default.properties中的屬性。
這個功能非常實用,一般的公司裡面都會有幾套執行環境,比如開發、測試、生產環境,這些環境中會有一些設定資訊是不同的,比如伺服器地址。那我們需要針對不同的環境使用指定的設定資訊,通過這種方式就可以很方便的去解決。
在properties檔案中定義的屬性,除了可以通過environment的getProperty方法獲取之外,spring還提供了@Value註解,
@RestController public class EnvironementController { @Value("${env}") private String env; @GetMapping("/env") public String env(){ return env; } }
spring容器在載入一個bean時,當發現這個Bean中有@Value註解時,那麼它可以從Environment中將屬性值進行注入,如果Environment中沒有這個屬性,則會報錯。
結合前面咱們講過的內容,我們來推測一下Environment的實現原理。
簡單演示一下Environment中的設定來源
-Denvtest=command
基於現有的內容的推導,我們可以畫出下面這樣一個圖。
下面這個是表示Environment的類關係圖,這個類關係圖還是非常清晰的體現了Environment的原理。
上述類圖的核心API說明如下
Environment介面,繼承了PropertyResolver。 PropertyResolver,它主要有兩個作用。
propertyName
屬性名獲取與之對應的propertValue
屬性值(getProperty)。${propertyName:defaultValue}
格式的屬性預留位置,替換為實際的值(resolvePlaceholders)。PropertyResolver的具體實現類是PropertySourcesPropertyResolver,屬性源的解決方案。該類是體系中唯一的完整實現類。它以PropertySources屬性源集合(內部持有屬性源列表List )為屬性值的來源,按序遍歷每個PropertySource,獲取到一個非null的屬性值則返回。
其中,PropertySourcesPropertyResolver中的List ,表示不同屬性源的來源,它的類關係圖如下,表示針對不同資料來源的儲存。
到此這篇關於詳解Spring中的Environment外部化設定管理的文章就介紹到這了,更多相關Spring Environment外部化設定內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45