依賴查找和依賴注入的區別

        簡單來說,依賴查找是主動和手動的依賴查找方式,通常需要依賴容器和標準api去實現;而依賴注入則是手動或自動依賴綁定的方式,無需依賴特定的容器和api。

       一、依賴查找

        依賴查找(Dependency Lookup,簡稱 DL),它是控制反轉設計原則的一種實現方式。它的大體思路是:容器中的受控對象通過容器的 API 來查找自己所依賴的資源和協作對象。這種方式雖然降低了對象間的依賴,但是同時也使用到了容器的 API,造成了我們無法在容器外使用和測試對象。依賴查找是一種更加傳統的 IOC 實現方式。

依賴查找也有兩種方式:

  • 依賴拖拽:注入的對象如何與組件發生聯繫,這個過程就是通過依賴拖拽實現;
  • 上下文依賴查找:在某些方面跟依賴拖拽類似,但是上下文依賴查找中,查找的過程是在容器管理的資源中進行的,而不是從集中註冊表中,並且通常是作用在某些設置點上;

        二、依賴注入

    依賴注入有三種方式:構造函數方法注入、Setter方法注入、接口注入和基於註解的依賴注入

  構造函數注入:

setter方法注入:

接口注入:

 

spring還提供了基於註解的注入:

Spring主要提供了@Autowired和@Resource註解模式,下面也重點討論這兩種註解模式。

@Autowired 註解,可以對Bean類成員變量、方法及構造函數進行標註,完成依賴注入的自動裝配工作。使用@Autowired可以省略Bean類的待依賴注入對象的set方法,@Autowired默認情況下按照依賴注入對象的類型自動進行匹配。加入@Autowired註解的方式是在Bean類依賴注入對象的前面加上@Autowired語句。

@Autowired還提供required的屬性,用來處理當注入的Bean實例不存在的情況。required爲true時,如果注入的Bean實例不存在,程序會拋出異常;required爲false時,如果注入的Bean實例不存在,程序會忽略。由於默認情況下@Autowired是按類型匹配的(byType),如果需要按名稱(byName)匹配,可以使用@Qualifier註解與@Autowired結合。

@Resource註解的功能和@Autowired註解功能相近,@Resource有name和type兩個主要的屬性。Spring容器對於@Resource註解的name屬性解析爲bean的名字,type屬性則解析爲bean的類型。因此使用name屬性,則按byName模式的自動注入策略,如果使用type屬性則按 byType模式自動注入策略。如果兩個屬性都未指定,Spring容器將通過反射技術默認按byName模式注入。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章