鍍金池/ 教程/ Java/ 依賴注入
Spring MVC Hello World 例子
事務(wù)管理
JDBC 框架概述
MVC 框架教程
Spring 自動裝配 ‘byName’
Spring 中的自定義事件
Spring 編程式事務(wù)管理
環(huán)境設(shè)置
概述
Spring 中 SQL 的存儲過程
體系結(jié)構(gòu)
Spring 中的事件處理
Spring 靜態(tài)頁面例子
基于注解的配置
依賴注入
Spring 自動裝配 ‘byType’
Spring 由構(gòu)造函數(shù)自動裝配
Spring @Qualifier 注釋
Spring ApplicationContext 容器
Spring 中基于 AOP 的 XML架構(gòu)
Bean 的生命周期
IoC 容器
注入內(nèi)部 Beans
Spring JDBC 示例
Spring 基于構(gòu)造函數(shù)的依賴注入
Spring @Required 注釋
Hello World 實(shí)例
Bean 定義
Sping 的 BeanFactory 容器
Spring 頁面重定向例子
Bean 定義繼承
Spring 中基于 AOP 的 @AspectJ
注入集合
Beans 自動裝配
Spring 異常處理例子
Spring 聲明式事務(wù)管理
Spring @Autowired 注釋
基于 Java 的配置
Spring MVC 表單處理例子
Spring——Bean 后置處理器
使用 Log4J 記錄日志
Spring 基于設(shè)值函數(shù)的依賴注入
Spring JSR-250 注釋
Bean 的作用域
Spring 框架的 AOP

依賴注入

每個(gè)基于應(yīng)用程序的 java 都有幾個(gè)對象,這些對象一起工作來呈現(xiàn)出終端用戶所看到的工作的應(yīng)用程序。當(dāng)編寫一個(gè)復(fù)雜的 Java 應(yīng)用程序時(shí),應(yīng)用程序類應(yīng)該盡可能獨(dú)立于其他 Java 類來增加這些類重用的可能性,并且在做單元測試時(shí),測試獨(dú)立于其他類的獨(dú)立性。依賴注入(或有時(shí)稱為布線)有助于把這些類粘合在一起,同時(shí)保持他們獨(dú)立。

假設(shè)你有一個(gè)包含文本編輯器組件的應(yīng)用程序,并且你想要提供拼寫檢查。標(biāo)準(zhǔn)代碼看起來是這樣的:

public class TextEditor {
   private SpellChecker spellChecker;  
   public TextEditor() {
      spellChecker = new SpellChecker();
   }
}

在這里我們所做的就是創(chuàng)建一個(gè) TextEditor 和 SpellChecker 之間的依賴關(guān)系。在控制反轉(zhuǎn)的場景中,我們反而會做這樣的事情:

public class TextEditor {
   private SpellChecker spellChecker;
   public TextEditor() {
      spellChecker = new SpellChecker();
   }
}

在這里,TextEditor 不應(yīng)該擔(dān)心 SpellChecker 的實(shí)現(xiàn)。SpellChecker 將會獨(dú)立實(shí)現(xiàn),并且在 TextEditor 實(shí)例化的時(shí)候?qū)⑻峁┙o TextEditor,整個(gè)過程是由 Spring 框架的控制。

在這里,我們已經(jīng)從 TextEditor 中刪除了全面控制,并且把它保存到其他地方(即 XML 配置文件),且依賴關(guān)系(即 SpellChecker 類)通過類構(gòu)造函數(shù)被注入到 TextEditor 類中。因此,控制流通過依賴注入(DI)已經(jīng)“反轉(zhuǎn)”,因?yàn)槟阋呀?jīng)有效地委托依賴關(guān)系到一些外部系統(tǒng)。

依賴注入的第二種方法是通過 TextEditor 類的 Setter 方法,我們將創(chuàng)建 SpellChecker 實(shí)例,該實(shí)例將被用于調(diào)用 setter 方法來初始化 TextEditor 的屬性。

因此,DI 主要有兩種變體和下面的兩個(gè)子章將結(jié)合實(shí)例涵蓋它們:

序號 依賴注入類型 & 描述
1 Constructor-based dependency injection

當(dāng)容器調(diào)用帶有多個(gè)參數(shù)的構(gòu)造函數(shù)類時(shí),實(shí)現(xiàn)基于構(gòu)造函數(shù)的 DI,每個(gè)代表在其他類中的一個(gè)依賴關(guān)系。

2 Setter-based dependency injection

基于 setter 方法的 DI 是通過在調(diào)用無參數(shù)的構(gòu)造函數(shù)或無參數(shù)的靜態(tài)工廠方法實(shí)例化 bean 之后容器調(diào)用 beans 的 setter 方法來實(shí)現(xiàn)的。

你可以混合這兩種方法,基于構(gòu)造函數(shù)和基于 setter 方法的 DI,然而使用有強(qiáng)制性依存關(guān)系的構(gòu)造函數(shù)和有可選依賴關(guān)系的 sette r是一個(gè)好的做法。

代碼是 DI 原理的清洗機(jī),當(dāng)對象與它們的依賴關(guān)系被提供時(shí),解耦效果更明顯。對象不查找它的依賴關(guān)系,也不知道依賴關(guān)系的位置或類,而這一切都由 Spring 框架控制的。