Spring set注入和構造注入的區別
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首先例項化物件,然後才例項化所有依賴的物件。
相關文章
- Spring注入:配置注入(set注入和構造器注入)與註解注入Spring
- 【Spring實戰】—— 2 構造注入Spring
- Spring6框架中依賴注入的多種方式(推薦構造器注入)Spring框架依賴注入
- Java Spring各種依賴注入註解的區別JavaSpring依賴注入
- SpringAOP_構造注入實現Spring
- Spring原始碼--debug分析迴圈依賴--構造器注入Spring原始碼
- Spring中注入List,Set,Map,Properties的xml檔案配置方法SpringXML
- sql注入之型別及提交注入SQL型別
- Spring配置注入Spring
- Java開發學習(六)----DI依賴注入之setter及構造器注入解析Java依賴注入
- Spring review--常用屬性String、int、list、set、Map的注入SpringView
- spring 的依賴注入Spring依賴注入
- spring心得5--構造器注入@設定控制@案例加註解剖析Spring
- spring應用手冊-IOC(XML配置實現)-(26)-注入set集合SpringXML
- spring原始碼乾貨分享-物件建立詳細解析(set注入和初始化)Spring原始碼物件
- spring泛型注入Spring泛型
- Spring-注入方式Spring
- Spring(二)——注入物件Spring物件
- Spring依賴注入Spring依賴注入
- Spring依賴注入---Spring依賴注入
- Spring--方法注入Spring
- C++ DLL注入和程式碼注入C++
- Spring 控制反轉和依賴注入Spring依賴注入
- Spring 依賴注入的理解Spring依賴注入
- spring的四種注入方式Spring
- 關於Spring的bean注入SpringBean
- Spring系列第八講 依賴注入之手動注入Spring依賴注入
- Spring原始碼系列:依賴注入(三)-屬性注入Spring原始碼依賴注入
- alter system set event和set events的區別
- Spring的依賴注入的方式Spring依賴注入
- Spring IOC——依賴注入Spring依賴注入
- Spring 依賴注入 DISpring依賴注入
- Spring @Autowired 注入小技巧Spring
- Spring 容器自動注入.Spring
- Spring-註解注入Spring
- Spring 注入static變數Spring變數
- 【Spring Boot】yaml配置注入Spring BootYAML
- Spring基於建構函式和設值函式的依賴注入Spring函式依賴注入