未經許可的轉載,本人保留一切法律權益。
一直以來,發現有某些人完全不尊重我的勞動成果,隨意轉載,提醒一下那些人小心哪天惹上官司。
緣起
隨著系統中不斷的增加需求,功能越來越多了。昨天,看到我項目中的application.xml已經超過了1000行,還有Acegi和XFire的配置文件,也比較長,所以就想著來分拆和瘦身。
基礎
如果沒有記錯的話,Spring是從1.2起,開始支持自動裝載的,這并不是雞肋功能,在Spring 2.0中得到了進一步的改進。到目前為止,Spring共支持以下五種方式的自動裝載:
模式 | 說明 |
---|---|
no | 不使用自動裝配。必須通過 |
byName | 根據屬性名自動裝配。此選項將檢查容器并根據名字查找與屬性完全一致的bean,并將其與屬性自動裝配。例如,在bean定義中將autowire設置為by name,而該bean包含master屬性(同時提供setMaster(..)方法),Spring就會查找名為 |
byType | 如果容器中存在一個與指定屬性類型相同的bean,那么將與該屬性自動裝配。如果存在多個該類型的bean,那么將會拋出異常,并指出不能使用byType方式進行自動裝配。若沒有找到相匹配的bean,則什么事都不發生,屬性也不會被設置。如果你不希望這樣,那么可以通過設置 |
constructor | 與byType的方式類似,不同之處在于它應用于構造器參數。如果在容器中沒有找到與構造器參數類型一致的bean,那么將會拋出異常。 |
autodetect | 通過bean類的自省機制(introspection)來決定是使用constructor還是byType方式進行自動裝配。如果發現默認的構造器,那么將使用byType方式。 |
步驟
1,將application.xml分成兩個,一個文件里面管理的是系統基本信息的Bean管理,另一個文件是業務信息的Bean管理(當然,如果你覺得還不夠的話,可以將其按功能模塊進一步拆分)。
拆分后當然需要更改web.xml中的配置,如下:




2,使用byType的方式,對業務信息部分的Bean進行自動裝載,因為我Class中的有些屬性可能并不與XML配置中的名稱一致,所以想使用這樣的方式相對簡單,不需要去將屬性名和XML的Bean ID一一對應。配置如下:




來,啟動應用,試試看效果吧。正在我慶幸自己不用去比對名稱的時候,系統到如下階段時停住了。
|INFO?|2008-09-02?22:56:50;206|org.springframework.orm.hibernate3.HibernateTransactionManager:org.springframework.orm.hibernate3.HibernateTransactionManager.afterPropertiesSet(371)|Using?DataSource?[org.apache.commons.dbcp.BasicDataSource@6da8eb]?of?Hibernate?SessionFactory?for?HibernateTransactionManager|
此時我等了5分鐘,CPU一直被Javaw進程占用,使用率高達98%,目前還不知道為什么會這樣,也請各位不吝賜教。
3,既然byType行不通,那就只能byName了,配置如下:




成果
1,項目業務模塊部分的Bean配置文件一下從原來的800多行變為400多行,瘦身近50%。
2,系統啟動時,縮短了XML校驗的時間,雖然時間每次縮小的很短,這對于調試來說,還是很值的,因為項目開發中所有調試的運行會有很多次,總量加起也不是個小數目。
3,以后增加功能模塊時,就算是Copy以前的配置來改,也可以少改幾個地方。
這筆買賣似乎還很值喲,^-^
總結
1,建議不要將所有Bean都設成自動裝載,而只用將業務相關的Bean設成自動裝載。
2,如果你的項目中名稱使用很亂,沒有規范,那就不要用byName的自動裝載了。
3,如果是重構時使用的自動裝載,一定要記得做冒煙測試。