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