首頁 > 軟體

深入淺出講解Spring框架中依賴注入與控制反轉及應用

2022-03-31 13:03:18

概念:

     依賴注入(Dependency Injection,DI)與控制反轉(IoC)的含義相同,只不過是從兩個角度描述的同一個概念。對於一個Spring初學者來說,這兩種稱呼都很難理解,我們通過簡單的語言來描述這兩個概念。

使用對比

1. 使用前:

      當某個Java物件(呼叫者)需要呼叫另一個Java物件(被呼叫者,就是被依賴物件)時,在傳統模式下,呼叫者通常會採用"new被呼叫者"的程式碼方式來建立物件。這種方式會導致呼叫者與被呼叫者之間的耦合性增加,不利於後期專案的升級和維護。

2. 使用後:

    在使用Spring框架後,物件的範例不再由呼叫者來建立,而是由Spring框架的容器來建立,它會負責控制程式之間的關係,而不是由呼叫者的程式程式碼直接控制。這樣,控制權由應用程式碼轉移到Spring框架容器,控制權發生了反轉,這就是Spring框架的控制反轉。

    從Spring框架容器的角度來看,它負責將被依賴物件賦值給呼叫者的成員變數,相當於呼叫者注入了其依賴範例,這就是Spring框架的依賴注入。

理解控制反轉(Ioc):

     控制反轉也稱為依賴注入,是物件導向程式設計中的一種設計理念,用來降低程式程式碼間的耦合度,在MVC的設計模式中經常使用。首先考慮什麼是依賴。依賴在程式碼中一般指通過區域性變數、方法引數、返回值等建立的對於其他物件的呼叫關係。例如,在A類的方法中,範例化了B類的物件並呼叫其方法以完成特定的功能,即A類依賴於B類。

     幾乎所有應用都由兩個或更多的類,通過彼此合作來實現完整功能的。類與類之間的依賴關係增加了程式開發的複雜程度,在開發一個類的時候,還要考慮對正在使用該類的其他類的影響。如常見的業務層呼叫資料存取層實現持久化操作,解決問題的步驟如下:

(1)獲取Spring開發包併為工程新增Spring框架支援

(2)為業務層和資料存取層介面,宣告所需要的方法

(3)編寫資料存取層介面UserDao的實現類,完成具體的持久化操作

(4)在業務實現類中宣告UserDao介面型別的屬性,並新增適當的構造方法為屬性賦值

(5)在Spring的組態檔中,將DAO物件以構造注入的方式賦值給業務範例的UserDao型別屬性

(6)在程式碼中獲取Spring組態檔裝配好的業務類物件,實現程式功能

IoC的應用方法 

IoC容器中設定屬性的語法

第一種方式:

Book.java

package cn.spring.ioc.demo.exercise;
 
public class Book {
    private Integer id;
    private String bookName;
    private Float price;
 
    public Integer getId() {
        return id;
    }
 
    public String getBookName() {
        return bookName;
    }
 
    public Float getPrice() {
        return price;
    }
 
    public void setId(Integer id) {
        this.id = id;
    }
 
    public void setBookName(String bookName) {
        this.bookName = bookName;
    }
 
    public void setPrice(Float price) {
        this.price = price;
    }
 
    @Override
    public String toString() {
        return "Book{" +
                "id=" + id +
                ", bookName='" + bookName + ''' +
                ", price=" + price +
                '}';
    }
}

容器設定:

    <bean id="book1" class="cn.spring.ioc.demo.exercise.Book">
        <property name="id" value="1001"/>
        <property name="bookName" value="C++基礎程式設計"/>
        <property name="price" value="28.2"/>
    </bean>

第二種方式:

Book_1.java

package cn.spring.ioc.demo.exercise;
 
public class Book_1 {
    private Integer id;
    private String bookName;
    private Float price;
 
    public Book_1(Integer id,String bookName,Float price){
        this.id = id;
        this.bookName = bookName;
        this.price = price;
    }
 
    public Integer getId() {
        return id;
    }
 
    public String getBookName() {
        return bookName;
    }
 
    public Float getPrice() {
        return price;
    }
 
    public void setId(Integer id) {
        this.id = id;
    }
 
    public void setBookName(String bookName) {
        this.bookName = bookName;
    }
 
    public void setPrice(Float price) {
        this.price = price;
    }
 
    @Override
    public String toString() {
        return "Book_1{" +
                "id=" + id +
                ", bookName='" + bookName + ''' +
                ", price=" + price +
                '}';
    }
}

容器設定:

    <bean id="book2" class="cn.spring.ioc.demo.exercise.Book_1">
        <constructor-arg index="0" value="1002"/>
        <constructor-arg index="1" value="Java/>
        <constructor-arg index="2" value="33.3"/>
    </bean>

第三種方式:

BookFactory.java

package cn.spring.ioc.demo.exercise;
 
public class BookFactory {
    public Book getBookInstance(Book book){
        return book;
    }
}

容器設定:

    <bean id="book3" class="cn.spring.ioc.demo.exercise.Book">
        <property name="id" value="1004"/>
        <property name="bookName" value="go"/>
        <property name="price" value="88.2"/>
    </bean>
 
    <bean id="factory" class="cn.spring.ioc.demo.exercise.BookFactory" />
    <bean id="finstance" factory-bean="factory" factory-method="getBookInstance">
        <constructor-arg index="0" ref="book3"/>
    </bean>

第四種方式:

Book_1Factory.java

package cn.spring.ioc.demo.exercise;
 
public class Book_1Factory {
    public static Book_1 getBookInstance(Integer id,String bookName,Float price){
        return new Book_1(id, bookName, price);
    }
}

容器設定:

    <bean id="bf" class="cn.spring.ioc.demo.exercise.Book_1Factory" factory-method="getBookInstance">
        <constructor-arg index="0" value="1003"/>
        <constructor-arg index="1" value="python"/>
        <constructor-arg index="2" value="99.9"/>
    </bean>

到此這篇關於深入淺出講解Spring框架中依賴注入與控制反轉及應用的文章就介紹到這了,更多相關Spring框架 依賴注入內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


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