Spring依賴注入的三種實現方式


依賴注入(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() 方法,如下所示。

  1.  
    package com.mengma.ioc;
  2.  
    public interface PersonService {
  3.  
    public void addPerson();
  4.  
    }

2. 創建接口實現類 PersonServiceImpl

在 com.mengma.ioc 包下創建一個名為 PersonServiceImpl 的類,該類實現了 PersonService 接口,如下所示。 

  1.  
    package com.mengma.ioc;
  2.  
    public class PersonServiceImpl implements PersonService {
  3.  
    // 定義接口聲明
  4.  
    private PersonDao personDao;
  5.  
    // 提供set()方法,用於依賴注入
  6.  
    public void setPersonDao(PersonDao personDao) {
  7.  
    this.personDao = personDao;
  8.  
    }
  9.  
    // 實現PersonService接口的方法
  10.  
    @Override
  11.  
    public void addPerson() {
  12.  
    personDao.add(); // 調用PersonDao中的add()方法
  13.  
    System.out.println( "addPerson()執行了...");
  14.  
    }
  15.  
    }

上述代碼中,首先聲明了 personDao 對象,並為其添加 setter 方法,用於依賴注入,然后實現了 PersonDao 接口的 addPerson() 方法,並在方法中調用 save() 方法和輸出一條語句。

3. 在 applicationContext.xml 中添加配置信息

在 applicationContext.xml 配置文件中添加一個 <bean> 元素,用於實例化 PersonServiceImpl 類,並將 personDao 的實例注入到 personService 中,其實現代碼如下所示: 

  1.  
    <bean id="personService" class="com.mengma.ioc.PersonServiceImpl">
  2.  
    <!-- 將personDao實例注入personService實例中 -->
  3.  
    <property name="personDao" ref="personDao"/>
  4.  
    </bean>

4. 編寫測試方法

在 FirstTest 類中創建一個名為 test2() 的方法,編輯后如下所示: 

  1.  
    public void test2() {
  2.  
    // 定義Spring配置文件的路徑
  3.  
    String xmlPath = "applicationContext.xml";
  4.  
    // 初始化Spring容器,加載配置文件
  5.  
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext(
  6.  
    xmlPath);
  7.  
    // 通過容器獲取personService實例
  8.  
    PersonService personService = (PersonService) applicationContext
  9.  
    .getBean( "personService");
  10.  
    // 調用personService的addPerson()方法
  11.  
    personService.addPerson();
  12.  
    }

2)構造方法注入

指 IoC 容器使用構造方法注入被依賴的實例。基於構造器的 DI 通過調用帶參數的構造方法實現,每個參數代表一個依賴。

  2.1 創建接口實現類 PersonServiceImpl

  1.  
    package com.mengma.ioc;
  2.  
    public class PersonServiceImpl implements PersonService {
  3.  
    // 定義接口聲明
  4.  
    private PersonDao personDao;
  5.  
    // 提供有參構造器,用於依賴注入
  6.  
    public PersonServiceImpl(PersonDao personDao) {
  7.  
    this.personDao = personDao;
  8.  
    }
  9.  
    // 實現PersonService接口的方法
  10.  
    @Override
  11.  
    public void addPerson() {
  12.  
    personDao.add(); // 調用PersonDao中的add()方法
  13.  
    System.out.println( "addPerson()執行了...");
  14.  
    }
  15.  
    }

3.1 在 applicationContext.xml 中添加配置信息

  1.  
    <bean id= "personService" class="com.mengma.ioc.PersonServiceImpl">
  2.  
    <!-- 將personDao實例注入personService實例中 -->
  3.  
    <constructor-arg ref= "personDao"/>
  4.  
    </bean>

3)接口注入 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM