人在江湖

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            82 Posts :: 10 Stories :: 169 Comments :: 0 Trackbacks

          轉自:http://blog.csdn.net/ycyheartfly/archive/2007/02/25/1514190.aspx

          Spring種提供了2種常用的注入方式,set方法注入和構造函數注入。由于這2種注入方式很相似,都可以滿足我們的需求,所以在大多數情況下我們忽視了這2種注入方式的區別。下面讓我們看看這2種注入方式的特點。
          我們先看看Spring在使用set方法注入時,是怎樣實例化一個Bean和Bean的合作者的:

          在A中有一個setB方法用來接收B對象的實例。那么Spring實例化A對象的過程如下:

          在不考慮Bean的初始化方法和一些Spring回調的情況下,Spring首先去調用A對象的構造函數實例化A,然后查找A依賴的對象本例子中是B(合作者)。一但找到合作者,Spring就會調用合作者(B)的構造函數實例化B。如果B還有依賴的對象Spring會把B上依賴的所有對象都按照相同的機制實例化然后調用A對象的setB(B b)把b對象注入給A。
          因為Spring調用一個對象的set方法注入前,這個對象必須先被實例化。所以在"使用set方法注入"的情況下Spring會首先調用對象的構造函數。
          我們在來看通過構造函數注入的過程:

          如果發現配置了對象的構造注入,那么Spring會在調用構造函數前把構造函數需要的依賴對象都實例化好,然后再把這些實例化后的對象作為參數去調用構造函數。
          在使用構造函數和set方法依賴注入時,Spring處理對象和對象依賴的對象的順序時不一樣的。一般把一個Bean設計為構造函數接收依賴對象時,其實是表達了這樣一種關系:他們(依賴對象)不存在時我也不存在,即“沒有他們就沒有我”。
          通過構造函數的注入方式其實表達了2個對象間的一種強的聚合關系:組合關系。就比如一輛車如果沒有輪子、引擎等部件那么車也就不存在了。而且車是由若干重要部件組成的,在這些部件沒有的情況下車也不可能存在。這里車和他的重要部件就時組合的關系。如果你的應用中有這樣類似的場景那么你應該使用“構造函數注入”的方式管理他們的關系。“構造函數注入”可以保證合作者先創建,在后在創建自己。
          通過set方法注入的方式表達了2個對象間較弱的依賴關系:聚合關系。就像一輛車,如果沒有車內音像車也時可以工作的。當你不要求合作者于自己被創建時,“set方法注入”注入比較合適。
          雖然在理論上“構造函數注入”和“set方法注入”代表2種不同的依賴強度,但是在spring中,spring并不會把無效的合作者傳遞給一個 bean。如果合作者無效或不存在spring會拋出異常,這樣spring保證一個對象的合作者都是可用的。所以在spring中,“構造函數注入”和 “set方法注入”唯一的區別在于2種方式創建合作者的順序不同。
          使用構造函數依賴注入時,Spring保證所有一個對象所有依賴的對象先實例化后,才實例化這個對象。(沒有他們就沒有我原則)
          使用set方法依賴注入時,Spring首先實例化對象,然后才實例化所有依賴的對象。

          posted on 2011-04-07 23:36 人在江湖 閱讀(1243) 評論(0)  編輯  收藏 所屬分類: spring
          主站蜘蛛池模板: 重庆市| 同仁县| 阳谷县| 农安县| 保山市| 垫江县| 深水埗区| 黎平县| 深泽县| 兴海县| 八宿县| 天镇县| 大同市| 南京市| 水富县| 巢湖市| 通榆县| 望谟县| 麻阳| 开化县| 兰西县| 忻城县| 上思县| 玉门市| 龙江县| 福鼎市| 西林县| 额济纳旗| 清远市| 德清县| 商丘市| 墨脱县| 洛隆县| 永德县| 万山特区| 湾仔区| 安顺市| 建始县| 四子王旗| 南部县| 德安县|