首頁 > 軟體

Spring依賴注入(DI)兩種方式的範例詳解

2022-06-08 22:02:56

一、依賴注入方式

思考:向一個類中傳遞資料的方式有幾種?

  • 普通方法(set方法)
  • 構造方法

思考:依賴注入描述了在容器中建立bean與bean之間依賴關係的過程,如果bean執行需要的是數位或字串呢?

  • 參照型別
  • 簡單型別(基本資料型別與String)

依賴注入方式:

setter注入

  • 簡單型別
  • 參照型別

構造器注入

  • 簡單型別
  • 參照型別

二、setter注入

參照型別

在bean中定義參照型別屬性並提供可存取的set方法

import com.itheima.dao.BookDao;
import com.itheima.service.BookService;
 
public class BookServiceImpl implements BookService {
    private BookDao bookDao;
 
    public void save() {
        System.out.println("book service save ...");
        bookDao.save();
    }
    public void setBookDao(BookDao bookDao) {
        this.bookDao = bookDao;
    }
}

設定中使用property標籤ref屬性注入參照型別物件

<!--注入參照型別-->
    <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl">
        <!--property標籤:設定注入屬性-->
        <!--name屬性:設定注入的屬性名,實際是set方法對應的名稱-->
        <!--ref屬性:設定注入參照型別bean的id或name-->
        <property name="bookDao" ref="bookDao"/>
        <property name="userDao" ref="userDao"/>
    </bean>

簡單型別

BookDaoImpl實現類:

在bean中定義參照型別屬性並提供可存取的set方法

import com.itheima.dao.BookDao;
 
public class BookDaoImpl implements BookDao {
 
    private String databaseName;
    private int connectionNum;
 
    //setter注入需要提供要注入物件的set方法
    public void setConnectionNum(int connectionNum) {
        this.connectionNum = connectionNum;
    }
 
    //setter注入需要提供要注入物件的set方法
    public void setDatabaseName(String databaseName) {
        this.databaseName = databaseName;
    }
 
    public void save() {
        System.out.println("book dao save ..." + databaseName + "," + connectionNum);
    }
}

applicationContext.xml設定:

設定中使用property屬性value注入簡單型別物件

<!--注入簡單型別-->
    <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl">
        <!--property標籤:設定注入屬性-->
        <!--name屬性:設定注入的屬性名,實際是set方法對應的名稱-->
        <!--value屬性:設定注入簡單型別資料值-->
        <property name="connectionNum" value="100"/>
        <property name="databaseName" value="mysql"/>
    </bean>

三、構造器注入

參照型別

在bean中定義參照型別屬性並提供可存取的構造方法

public class BookServiceImpl implements BookService{
    private BookDao bookDao;
    private UserDao userDao;
 
    public BookServiceImpl(BookDao bookDao, UserDao userDao) {
        this.bookDao = bookDao;
        this.userDao = userDao;
    }
}

設定中使用constructor-arg標籤ref屬性注入參照型別物件

<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"/>
 
<bean id="bookService" class="com.itheima.service.impl.BookServiceImpl">
        <constructor-arg name="userDao" ref="userDao"/>
        <constructor-arg name="bookDao" ref="bookDao"/>
    </bean>

簡單型別

在bean中定義參照型別屬性並提供可存取的構造方法

public class BookDaoImpl implements BookDao {
    private String databaseName;
    private int connectionNum;
 
    public BookDaoImpl(String databaseName, int connectionNum) {
        this.databaseName = databaseName;
        this.connectionNum = connectionNum;
    }
}

設定中使用constructor-arg標籤ref屬性注入參照型別物件

<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl">
        <!--根據構造方法引數名稱注入-->
        <constructor-arg name="connectionNum" value="10"/>
        <constructor-arg name="databaseName" value="mysql"/>
 </bean>

引數適配(瞭解)

設定中使用constructor-arg標籤type屬性注入參照型別物件

<!--解決形參名稱的問題,與形參名不耦合-->
    <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl">
        <!--根據構造方法引數型別注入-->
        <constructor-arg type="int" value="10"/>
        <constructor-arg type="java.lang.String" value="mysql"/>
    </bean>

設定中使用constructor-arg標籤index屬性注入參照型別物件

 <!--解決引數型別重複問題,使用位置解決引數匹配-->
    <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl">
        <!--根據構造方法引數位置注入-->
        <constructor-arg index="0" value="mysql"/>
        <constructor-arg index="1" value="100"/>
    </bean>

四、依賴注入方式選擇

1、強制依賴使用構造器進入,使用setter注入有概率不進入注入導致null物件出現

2、可選依賴使用setter注入進行,靈活性強

3、Spring框架倡導使用構造器,第三方框架內部大多數採用構造器注入的形式進行資料初始化,相對嚴謹

4、如果有必要可以兩者同時使用,使用構造器注入完成強制依賴的注入,使用setter注入完成可依賴的注入

5、實際開發過程中還要根據實際情況分析,如果受控物件沒有提供setter方法就必須使用構造器注入

6、自己開發的模組推薦使用setter注入

到此這篇關於Spring依賴注入(DI)兩種方式的範例詳解的文章就介紹到這了,更多相關Spring依賴注入內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com