背景

假設(shè)開發(fā)了一個中間件,比如是一個緩存系統(tǒng),這個中間件要配置一個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),分別給不同的業(yè)務(wù)使用,那就這時會有很多的配置的麻煩。
從使用者的角度出發(fā),應(yīng)用不喜歡引入一堆的配置,它們只希望import一個配置文件,然后在代碼里用@AutoWried注入一個Bean,就可以使用了。
Spring Bean被覆蓋的風(fēng)險。
如果兩個不同的業(yè)務(wù)都使用了這個cache,然后它們的jar包又再被第三個業(yè)務(wù)引用,那么它們都import了一個cache service的配置,那么就有可能出現(xiàn)后面的Bean定義被前面的覆蓋了。而Spring默認(rèn)不處理這種Bean重復(fù)定義的問題。
@AutoWried 注入的問題。和上一個問題類似,@AutoWried注入時如果沒有配置@Qualifier,那么如果某個類有多個Bean實例,那么就有可能出現(xiàn)Bean注入混亂的情況。
線上環(huán)境臨時切換。必須要支持線上臨時修改配置。
開發(fā)者無需配置。要提供默認(rèn)值的配置,開發(fā)者不用做配置就可以直接在本地和測試環(huán)境運行代碼。
靜默發(fā)布新版配置。比如當(dāng)集群遷移了,IP地址變換了,應(yīng)用不用修改代碼和配置,只需要用Maven重新打包即可。
可以利用的技術(shù)
spring profile,,@AutoWried,@Qualifier, PropertyPlaceholderConfigurer,PropertyOverrideConfigurer。
profile,PropertyPlaceholderConfigurer等的相關(guān),不一一介紹了。如果有不明白的,可以到spring的文檔里參考下。
簡要列舉下是如何解決上面的問題的。
1.在緩存中間件的jar包里放上三個集群的默認(rèn)配置:
2.看下spring-cacheClusterA.xm里的內(nèi)容:
<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分別對應(yīng)開發(fā),測試,線上三種環(huán)境。
而在具體bean的配置上,用了一些"${}"這樣的占位符,另外還為它們配置了默認(rèn)值。
PropertyPlaceholderConfigurer,PropertyOverrideConfigurer可以配置默認(rèn)值,估計這功能比較少人知道 。
這樣就解決了不同環(huán)境,還要有默認(rèn)配置的問題。
3.使用者的使用方法
假定使用者要用到clusterA和clusterB這兩個集群,那么可以這樣配置:
<context:property-placeholder location="classpath:env.properties" />
<import resource="cacheConfigDefault/spring-cacheClusterA.xml" />
<import resource="cacheConfigDefault/spring-cacheClusterB.xml" />
import了緩存中間件的默認(rèn)配置,然后還用placeholder加載了一個env.properties的環(huán)境變量文件。
那么對于spring-cacheClusterA.xml和spring-cacheClusterB.xml里的address這個屬性,如果沒有在env.properties里有配置,則會使用默認(rèn)配置。
如果想要修改,如修改cacheClusterA的配置,則可以在env.properties里加下:
#if comment this, will use the default value
cache.address.clusterA=testClusterAAddress
那么clusterA使用的就是用戶的配置,而不是所依賴的jar包的默認(rèn)配置了。
其它
調(diào)試spring placeholder時,或者線上查看placeholder到底有沒有工作時,可以把spring的log級別調(diào)為TRACE,這樣就可以看到很多有用的信息了。
創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國云服務(wù)器,動態(tài)BGP最優(yōu)骨干路由自動選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡(luò)助力業(yè)務(wù)部署。公司持有工信部辦法的idc、isp許可證, 機房獨有T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確進行流量調(diào)度,確保服務(wù)器高可用性。佳節(jié)活動現(xiàn)已開啟,新人活動云服務(wù)器買多久送多久。
網(wǎng)頁名稱:適應(yīng)各種開發(fā),測試,線上,線下環(huán)境的Spring配置方式-創(chuàng)新互聯(lián)
網(wǎng)頁URL:http://www.chinadenli.net/article6/deegog.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站、網(wǎng)站導(dǎo)航、企業(yè)網(wǎng)站制作、商城網(wǎng)站、全網(wǎng)營銷推廣、營銷型網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容