溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

適應(yīng)各種開發(fā),測試,線上,線下環(huán)境的Spring配置方式

發(fā)布時間:2020-08-10 18:51:35 來源:網(wǎng)絡(luò) 閱讀:309 作者:沙漏半杯 欄目:編程語言

背景

假設(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被覆蓋的風險。

?


如果兩個不同的業(yè)務(wù)都使用了這個cache,然后它們的jar包又再被第三個業(yè)務(wù)引用,那么它們都import了一個cache service的配置,那么就有可能出現(xiàn)后面的Bean定義被前面的覆蓋了。而Spring默認不處理這種Bean重復定義的問題。


?


@AutoWried 注入的問題。和上一個問題類似,@AutoWried注入時如果沒有配置@Qualifier,那么如果某個類有多個Bean實例,那么就有可能出現(xiàn)Bean注入混亂的情況。

線上環(huán)境臨時切換。必須要支持線上臨時修改配置。

開發(fā)者無需配置。要提供默認值的配置,開發(fā)者不用做配置就可以直接在本地和測試環(huán)境運行代碼。

靜默發(fā)布新版配置。比如當集群遷移了,IP地址變換了,應(yīng)用不用修改代碼和配置,只需要用Maven重新打包即可。

?


可以利用的技術(shù)

spring profile,,@AutoWried,@Qualifier, PropertyPlaceholderConfigurer,PropertyOverrideConfigurer。


profile,PropertyPlaceholderConfigurer等的相關(guān),不一一介紹了。如果有不明白的,可以到spring的文檔里參考下。


?


簡要列舉下是如何解決上面的問題的。


1.在緩存中間件的jar包里放上三個集群的默認配置:




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的配置上,用了一些"${}"這樣的占位符,另外還為它們配置了默認值。


PropertyPlaceholderConfigurer,PropertyOverrideConfigurer可以配置默認值,估計這功能比較少人知道 。


這樣就解決了不同環(huán)境,還要有默認配置的問題。


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的環(huán)境變量文件。


那么對于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包的默認配置了。


?

其它

調(diào)試spring placeholder時,或者線上查看placeholder到底有沒有工作時,可以把spring的log級別調(diào)為TRACE,這樣就可以看到很多有用的信息了。


?

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI