熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java開源技術 >> 正文

Spring Autowire(自動裝載)的一次實踐

2013-11-23 20:39:03  來源: Java開源技術 

  緣起

  隨著系統中不斷的增加需求功能越來越多了昨天看到我項目中的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中的配置如下




    <contextparam>
        <paramname>contextConfigLocation</paramname>
        <paramvalue>classpath:applicationContext*xmlclasspath:xfireservletxml</paramvalue>
    </contextparam>

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




<beans defaultautowire=byType>

</beans>

  來啟動應用試試看效果吧正在我慶幸自己不用去比對名稱的時候系統到如下階段時停住了




|INFO | ::;|orgspringframeworkormhibernateHibernateTransactionManager:orgspringframeworkormhibernateHibernateTransactionManagerafterPropertiesSet()|Using DataSource [monsdbcpBasicDataSource@daeb] of Hibernate SessionFactory for HibernateTransactionManager|

  此時我等了分鐘CPU一直被Javaw進程占用使用率高達%目前還不知道為什麼會這樣也請各位不吝賜教

  既然byType行不通那就只能byName了配置如下




<beans defaultautowire=byName>

</beans>

  然後核對了一遍名稱為了保險我還是將每個功能都做了一下冒煙測試幸好不多只有二十個功能左右果然有兩個冒煙檢查一下發現是類裡面的屬性名的大小寫不對改正後一切OK

  成果

  項目業務模塊部分的Bean配置文件一下從原來的多行變為多行瘦身近% 系統啟動時縮短了XML校驗的時間雖然時間每次縮小的很短這對於調試來說還是很值的因為項目開發中所有調試的運行會有很多次總量加起也不是個小數目

  以後增加功能模塊時就算是Copy以前的配置來改也可以少改幾個地方

  這筆買賣似乎還很值喲^^

  總結

  建議不要將所有Bean都設成自動裝載而只用將業務相關的Bean設成自動裝載

  如果你的項目中名稱使用很亂沒有規范那就不要用byName的自動裝載了

  如果是重構時使用的自動裝載一定要記得做冒煙測試


From:http://tw.wingwit.com/Article/program/Java/ky/201311/28829.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.