依賴注入(Dependency Injection,DI)和控制反轉含義相同,它們是從兩個角度描述的同一個概念。
當某個JAVA實例需要另一個 Java 實例時,傳統的方法是由調用者創建被調用者的實例(例如,使用 new 關鍵字獲得被調用者實例),而使用Spring框架后,被調用者的實例不再由調用者創建,而是由 Spring 容器創建,這稱為控制反轉。
Spring 容器在創建被調用者的實例時,會自動將調用者需要的對象實例注入給調用者,這樣,調用者通過 Spring 容器獲得被調用者實例,這稱為依賴注入。
依賴注入主要有兩種實現方式,分別是屬性 setter 注入和構造方法注入。具體介紹如下。
1)屬性 setter 注入
指 IoC 容器使用 setter 方法注入被依賴的實例。通過調用無參構造器或無參 static 工廠方法實例化 bean 后,調用該 bean 的 setter 方法,即可實現基於 setter 的 DI。
1. 創建 PersonService 接口
在 springDemo01 項目的 com.mengma.ioc 包下創建一個名為 PersonService 的接口,該接口中包含一個 addPerson() 方法,如下所示。
-
package com.mengma.ioc;
-
public interface PersonService {
-
public void addPerson();
-
}
2. 創建接口實現類 PersonServiceImpl
在 com.mengma.ioc 包下創建一個名為 PersonServiceImpl 的類,該類實現了 PersonService 接口,如下所示。
-
package com.mengma.ioc;
-
public class PersonServiceImpl implements PersonService {
-
// 定義接口聲明
-
private PersonDao personDao;
-
// 提供set()方法,用於依賴注入
-
public void setPersonDao(PersonDao personDao) {
-
this.personDao = personDao;
-
}
-
// 實現PersonService接口的方法
-
-
public void addPerson() {
-
personDao.add(); // 調用PersonDao中的add()方法
-
System.out.println( "addPerson()執行了...");
-
}
-
}
上述代碼中,首先聲明了 personDao 對象,並為其添加 setter 方法,用於依賴注入,然后實現了 PersonDao 接口的 addPerson() 方法,並在方法中調用 save() 方法和輸出一條語句。
3. 在 applicationContext.xml 中添加配置信息
在 applicationContext.xml 配置文件中添加一個 <bean> 元素,用於實例化 PersonServiceImpl 類,並將 personDao 的實例注入到 personService 中,其實現代碼如下所示:
-
<bean id="personService" class="com.mengma.ioc.PersonServiceImpl">
-
<!-- 將personDao實例注入personService實例中 -->
-
<property name="personDao" ref="personDao"/>
-
</bean>
4. 編寫測試方法
在 FirstTest 類中創建一個名為 test2() 的方法,編輯后如下所示:
-
public void test2() {
-
// 定義Spring配置文件的路徑
-
String xmlPath = "applicationContext.xml";
-
// 初始化Spring容器,加載配置文件
-
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(
-
xmlPath);
-
// 通過容器獲取personService實例
-
PersonService personService = (PersonService) applicationContext
-
.getBean( "personService");
-
// 調用personService的addPerson()方法
-
personService.addPerson();
-
}
2)構造方法注入
指 IoC 容器使用構造方法注入被依賴的實例。基於構造器的 DI 通過調用帶參數的構造方法實現,每個參數代表一個依賴。
2.1 創建接口實現類 PersonServiceImpl
-
package com.mengma.ioc;
-
public class PersonServiceImpl implements PersonService {
-
// 定義接口聲明
-
private PersonDao personDao;
-
// 提供有參構造器,用於依賴注入
-
public PersonServiceImpl(PersonDao personDao) {
-
this.personDao = personDao;
-
}
-
// 實現PersonService接口的方法
-
-
public void addPerson() {
-
personDao.add(); // 調用PersonDao中的add()方法
-
System.out.println( "addPerson()執行了...");
-
}
-
}
3.1 在 applicationContext.xml 中添加配置信息
-
<bean id= "personService" class="com.mengma.ioc.PersonServiceImpl">
-
<!-- 將personDao實例注入personService實例中 -->
-
<constructor-arg ref= "personDao"/>
-
</bean>
3)接口注入