緣起
隨著系統中不斷的增加需求功能越來越多了昨天看到我項目中的applicationxml已經超過了行還有Acegi和XFire的配置文件也比較長所以就想著來分拆和瘦身
基礎
如果沒有記錯的話Spring是從起開始支持自動裝載的這並不是雞肋功能在Spring 中得到了進一步的改進到目前為止Spring共支持以下五種方式的自動裝載
模式 |
說明 |
no
不使用自動裝配必須通過ref
元素指定依賴這是默認設置由於顯式指定協作者可以使配置更靈活更清晰因此對於較大的部署配置推薦采用該設置而且在某種程度上它也是系統架構的一種文檔形式
byName
根據屬性名自動裝配此選項將檢查容器並根據名字查找與屬性完全一致的bean並將其與屬性自動裝配例如在bean定義中將autowire設置為by name而該bean包含master屬性(同時提供setMaster()方法)Spring就會查找名為master
的bean定義並用它來裝配給master屬性
byType
如果容器中存在一個與指定屬性類型相同的bean那麼將與該屬性自動裝配如果存在多個該類型的bean那麼將會拋出異常並指出不能使用byType方式進行自動裝配若沒有找到相匹配的bean則什麼事都不發生屬性也不會被設置如果你不希望這樣那麼可以通過設置dependencycheck=objects
讓Spring拋出異常
constructor
與byType的方式類似不同之處在於它應用於構造器參數如果在容器中沒有找到與構造器參數類型一致的bean那麼將會拋出異常
autodetect
通過bean類的自省機制(introspection)來決定是使用constructor還是byType方式進行自動裝配如果發現默認的構造器那麼將使用byType方式
步驟
將applicationxml分成兩個一個文件裡面管理的是系統基本信息的Bean管理另一個文件是業務信息的Bean管理(當然如果你覺得還不夠的話可以將其按功能模塊進一步拆分)
拆分後當然需要更改webxml中的配置如下
<context
param>
<param
name>contextConfigLocation</param
name>
<param
value>classpath:applicationContext*
xml
classpath:xfire
servlet
xml</param
value>
</context
param>
使用byType的方式對業務信息部分的Bean進行自動裝載因為我Class中的有些屬性可能並不與XML配置中的名稱一致所以想使用這樣的方式相對簡單不需要去將屬性名和XML的Bean ID一一對應配置如下
<beans default
autowire=
byType
>
</beans>
來啟動應用試試看效果吧正在我慶幸自己不用去比對名稱的時候系統到如下階段時停住了
|INFO |
:
:
;
|org
springframework
orm
hibernate
HibernateTransactionManager:org
springframework
orm
hibernate
HibernateTransactionManager
afterPropertiesSet(
)|Using DataSource [mons
dbcp
BasicDataSource@
da
eb] of Hibernate SessionFactory for HibernateTransactionManager|
此時我等了分鐘CPU一直被Javaw進程占用使用率高達%目前還不知道為什麼會這樣也請各位不吝賜教
既然byType行不通那就只能byName了配置如下
<beans default
autowire=
byName
>
</beans>
然後核對了一遍名稱為了保險我還是將每個功能都做了一下冒煙測試幸好不多只有二十個功能左右果然有兩個冒煙的檢查一下發現是類裡面的屬性名的大小寫不對改正後一切OK
成果
項目業務模塊部分的Bean配置文件一下從原來的多行變為多行瘦身近% 系統啟動時縮短了XML校驗的時間雖然時間每次縮小的很短這對於調試來說還是很值的因為項目開發中所有調試的運行會有很多次總量加起也不是個小數目
以後增加功能模塊時就算是Copy以前的配置來改也可以少改幾個地方
這筆買賣似乎還很值喲^^
總結
建議不要將所有Bean都設成自動裝載而只用將業務相關的Bean設成自動裝載
如果你的項目中名稱使用很亂沒有規范那就不要用byName的自動裝載了
如果是重構時使用的自動裝載一定要記得做冒煙測試
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28829.html