適應各種開發,測試,線上,線下環境的Spring配置方式
背景
假設開發了一箇中間件,比如是一個快取系統,這個中介軟體要配置一個IP地址,還要配置一個Factory,從這個Factory裡得到一個client,如:<bean name="cacheFactory" class="com.test.cache.Factory"> <property name="address" value="192.168.1.100"/> </bean> <bean name="cacheClient" factory-bean="cacheFactory" factory-method="getClient" />
然後這個中介軟體有三個叢集(clusterA, clusterB, clusterC),分別給不同的業務使用,那就這時會有很多的配置的麻煩。
- 從使用者的角度出發,應用不喜歡引入一堆的配置,它們只希望import一個配置檔案,然後在程式碼裡用@AutoWried注入一個Bean,就可以使用了。
- Spring Bean被覆蓋的風險。
如果兩個不同的業務都使用了這個cache,然後它們的jar包又再被第三個業務引用,那麼它們都import了一個cache service的配置,那麼就有可能出現後面的Bean定義被前面的覆蓋了。而Spring預設不處理這種Bean重複定義的問題。
- @AutoWried 注入的問題。和上一個問題類似,@AutoWried注入時如果沒有配置@Qualifier,那麼如果某個類有多個Bean例項,那麼就有可能出現Bean注入混亂的情況。
- 線上環境臨時切換。必須要支援線上臨時修改配置。
- 開發者無需配置。要提供預設值的配置,開發者不用做配置就可以直接在本地和測試環境執行程式碼。
- 靜默釋出新版配置。比如當叢集遷移了,IP地址變換了,應用不用修改程式碼和配置,只需要用Maven重新打包即可。
可以利用的技術
spring profile,,@AutoWried,@Qualifier, PropertyPlaceholderConfigurer,PropertyOverrideConfigurer。
profile,PropertyPlaceholderConfigurer等的相關,不一一介紹了。如果有不明白的,可以到spring的文件裡參考下。
簡要列舉下是如何解決上面的問題的。
1.在快取中介軟體的jar包裡放上三個叢集的預設配置:
2.看下spring-cacheClusterA.xm裡的內容:
<beans profile="dev">
<bean id="cacheClusterAFactory" class="com.test.cache.CacheFactory">
<property name="address" value="${cache.address.clusterA:127.0.0.1}"/>
</bean>
<bean name="cacheClusterAClient" factory-bean="cacheClusterAFactory" factory-method="getClient" />
</beans>
<beans profile="test">
<bean id="cacheClusterAFactory" class="com.test.cache.CacheFactory">
<property name="address" value="${cache.address.clusterA:192.168.1.101}"/>
</bean>
<bean name="cacheClusterAClient" factory-bean="cacheClusterAFactory" factory-method="getClient" />
</beans>
<beans profile="product">
<bean id="cacheClusterAFactory" class="com.test.cache.CacheFactory">
<property name="address" value="${cache.address.clusterA:10.10.1.10}"/>
</bean>
<bean name="cacheClusterAClient" factory-bean="cacheClusterAFactory" factory-method="getClient" />
</beans>
裡面定義了三個profile:dev,test,product。這三個profile分別對應開發,測試,線上三種環境。
而在具體bean的配置上,用了一些"${}"這樣的佔位符,另外還為它們配置了預設值。
PropertyPlaceholderConfigurer,PropertyOverrideConfigurer可以配置預設值,估計這功能比較少人知道 。
這樣就解決了不同環境,還要有預設配置的問題。
3.使用者的使用方法
假定使用者要用到clusterA和clusterB這兩個叢集,那麼可以這樣配置:
<context:property-placeholder location="classpath:env.properties" />
<import resource="cacheConfigDefault/spring-cacheClusterA.xml" />
<import resource="cacheConfigDefault/spring-cacheClusterB.xml" />
import了快取中介軟體的預設配置,然後還用placeholder載入了一個env.properties的環境變數檔案。
那麼對於spring-cacheClusterA.xml和spring-cacheClusterB.xml裡的address這個屬性,如果沒有在env.properties裡有配置,則會使用預設配置。
如果想要修改,如修改cacheClusterA的配置,則可以在env.properties里加下:
#if comment this, will use the default value
cache.address.clusterA=testClusterAAddress
那麼clusterA使用的就是使用者的配置,而不是所依賴的jar包的預設配置了。
詳細程式碼
再多詳細的程式碼和配置,可以到這裡找到演示的程式碼:
其它的一些東東
除錯spring placeholder時,或者線上檢視placeholder到底有沒有工作時,可以把spring的log級別調為TRACE,這樣就可以看到很多有用的資訊了。
相關推薦
使用Charles請求跳轉可作為線上和線下環境的跳轉
調試 訪問 too 接口 代碼 inf com 本地服務 連接 舉個例子: 1.後端拿測試環境的客戶端調試本地的代碼 2.連接後端本地服務測試客戶端和後端的交互 這樣就可以改變客戶端請求的測試環境換成其他的環境 一、配置 tools--Map remot...
適應各種開發,測試,線上,線下環境的Spring配置方式
背景 假設開發了一箇中間件,比如是一個快取系統,這個中介軟體要配置一個IP地址,還要配置一個Factory,從這個Factory裡得到一個client,如: <bean name="cacheFactory" class="com.test.cache.Fact
從零開始學產品第五篇:三個環境,開發、測試和線上
本篇為【從零開始學產品】系列課第1章第4節 歡迎到公眾號選單欄,獲取產品經理課程更多資料 上節課我們說到了,Bug的生命週期,而只有在測試環境和線上環境發現的Bug,才會被稱之為Bug。 倒底什麼是測試環境,什麼是線上環境,
開發轉測試七年,我從測試策略到測試架構(Test architecture)
程式設計師之間流傳著這樣一句順口溜:有人喜歡創造世界,他們做了開發者;有的人喜歡開發者,他們做了測試員。什麼是軟體測試?軟體測試就是一場本該在使用者面前發生的災難提前在自己面前發生了,這會讓他們生出一種救世主的感覺,拯救了使用者,也就拯救者這個軟體,避免了他們被解除安裝的命運。
開發轉測試七年,我從測試策略到測試架構
程式設計師之間流傳著這樣一句順口溜:有人喜歡創造世界,他們做了開發者;有的人喜歡開發者,他們做了測試員。什麼是軟體測試?軟體測試就是一場本該在使用者面前發生的災難提前在自己面前發生了,這會讓他們生出一種救世主的感覺,拯救了使用者,也就拯救者這個軟體,避免了他們被解除安裝的命運。
微信小程序平臺化開發案例,公開多商家門店線下盈利模式
運營 實例 images .cn 技術分享 盈利 後臺管理系統 線下 招募 小程序商圈平臺、多商家/門店入駐、開發管理後臺(實例分析) 咫尺網絡 出品 1、小程序“商圈平臺”開發設計源碼小程序平臺化經營,占據商圈流量高點,對外招募商家門店(多樣化盈利模式),打造人氣
Injection of autowired dependencies failed; autowire 自動註入失敗,測試類已初始化過了Spring容器。
ins cor als proc methods ase servle res resolved 1 嚴重: StandardWrapper.Throwable 2 org.springframework.beans.factory.BeanCreationExc
極限工坊淘小咖淺談:實體餐飲業的變革,線上擁抱線下,小程序的新零售
利用 網上 積分 新希望 都是 微信小程序 新的 附近 第三方服務 隨著互聯網的極速發展,人們的日常生活節奏逐漸加快,實體商家的經營的商鋪營業額已經到達率了瓶頸期,一些經常關註互聯網的商家早已經察覺小程序這是個新的風口,而互聯網的發展,也已經讓實體商家不得不做起線上+線下的
Linux下修改Mysql密碼的三種方式,測試過效果,能正常使用
密碼 root mysq cat 服務 方法 方式 運行 mysql密碼 個人分類: mysql修改密碼linux修改mysql密碼軟件編程 有時我們會忘記Mysql的密碼,或者想改一個密碼,以下將對這兩種情況修改密碼的三種解決方法做個總結 本文都以用戶為 root 為例;
開始為開源社群貢獻程式碼了,測試了一把,方法如下
Github 相信已經成為家喻戶曉的程式碼託管工具, 但訪問了多位周圍程式設計愛好者後發現, 對其的使用還僅限於 下載專案原始碼 和 備份專案原始碼 的程度, 今天我就來介紹一下一個比較重要的使用場景 貢獻程式碼 Fork 專案 首先需要fork這個專案, 進入專案
Redis主從配置後,測試沒有反應,兩者沒連上
Redis主從配置異常解決:Error condition on socket for SYNC: Connection refused 在Docker中搭建的Redis主從叢集時,從伺服器上的redis日誌報錯: 32677:S 08 Feb 16:14:38.947 * Connecting to
線程池--spring配置,靜態上下文獲取以及調用
spring@ImportResource({"classpath:dubbo.xml","classpath*:applicationContext.xml"})定義applicationContext.xml<?xml version="1.0" encoding="UTF-8"?><b
3.5星|科特勒《營銷革命4.0》:打造無縫銜接的線上和線下體驗
顯示 人生 購物 網上 info 3.5 lan 試用 交易 營銷革命4.0:從傳統到數字 第一作者科特勒是知名營銷學大師。三位作者在書中推出了營銷革命4.0的概念,強調無縫銜接的線上和線下體驗。 作者們認為:客戶路徑應該從4A改為5A:了解、吸引、問詢、行動和擁護
微信小程式開發——websocket(socket線上測試伺服器,或本地socket伺服器)
WeChat小程式交流(QQ群:769977169)效果圖程式碼示例xxx.wxml<button bindtap='startClick'>連線</button> <bu
linux伺服器如何設定目錄許可權,讓開發只能在測試目錄下開發,不在線上目錄上開發
當一臺伺服器上,既有測試環境,也有生成的環境,開發需要在線上測試,如果開發生產環境的許可權,那開發容易誤操作需求如下:(1)生產環境的程式碼,必須有專用的賬號登陸進行管理(2)開發測試環境的程式碼,開發能夠訪問,但訪問不了生產環境目錄位了實現這個目的,操作如下(1)將生產的環
移動端使用rem同時適應安卓ios手機原理解析,移動端響應式開發
size screen bsp 應用 屏幕 來看 比例 忽略 基礎 rem單位大家可能已經很熟悉,rem是隨著html的字體大小來顯示代表寬度的方法,我們怎樣進行移動端響應式開發呢 瀏覽器默認的字體大小為16px 及1rem 等於 16px 如果我們想要使1rem等於 12
tomcat配置虛擬路徑,可以解決實際開發中測試時前端訪問後臺電腦上的圖片的問題
ram 使用 mage height 顯示 地址 cal 重啟 server 首先電腦上要已經安裝好tomcat,安裝tomcat的教程可以從網上找到很多。這裏就不贅述了。 一般開始做一個web項目後,會涉及到用戶頭像,商品圖片等信息,這些圖片保存在項目中不方便,於是我將選
微信開發——測試號申請,接口配置,JS接口安全域名,自定義菜單
acc contents term 集中 from 調試工具 AR 賬號 下載 1、申請測試賬號: 先申請公眾號後,點擊進入公從號的管理頁面;找到“開發者工具”,找到“公眾平臺測試賬號”,點擊“進入”。 2、接口配置信息設置 必須要外網哦,也就是微信服務器要能
軟件工程 - Test-Driven Development (TDD),測試驅動開發
hat mage ssa com ask png TP aid ima 參考 https://baike.baidu.com/item/%E6%B5%8B%E8%AF%95%E9%A9%B1%E5%8A%A8%E5%BC%80%E5%8F%91/3328831?fr=al
spring-boot 多環境化配置 (如:開發,測試,生產等)
sring cloud中可以搭建配置中心,可以從本地電腦或者git上讀取配置,而且還可以選擇配置的版本(開發,測試,生產) spring boo