JavaRush /Java Blog /Random-TW /春天。第 3 課:使用 setter 進行 DI
Umaralikhon
等級 3
Красноярск

春天。第 3 課:使用 setter 進行 DI

在 Random-TW 群組發布
所以...我們繼續我們的春季課程。上一課中,我們學習如何使用類別建構函數注入依賴項。現在是時候向您介紹另一種依賴注入方法 - 使用setter。為了恢復對先前課程的記憶,我將向您展示我們程式的結構。 春天。 第 3 課. 使用 setter 的 DI - 1 我們只對 HiringDepartment 和 applicationContext 檔案感興趣。他們管理我們的專案。我們將重做它們。這是 HiringDepartment 檔案的舊程式碼:(清單 1)
package org.example;

public class HiringDepartment {
    private Development development; //Определяем интерфейс

    //Конструктор принимает an object интерфейса
    public HiringDepartment(Development development){
        this.development = development;
    }

    public void displayInfo(){
        System.out.println("Name: " + development.getName());
        System.out.println("Job: " + development.getJob());
    }
}
正如我們在這裡看到的,建構函數用於初始化 Development 類型的物件。我們刪除這個建構函式(或保留它,沒有差別)。讓我們寫一個 setter,如下例所示:(清單 2)
package org.example;

public class HiringDepartment {
    private Development development; //Определяем интерфейс

//Вместо конструктора используем сеттер
    public void setDevelopment(Development development){
        this.development = development;
    }

    public void displayInfo(){
        System.out.println("Name: " + development.getName());
        System.out.println("Job: " + development.getJob());
    }
}
現在讓我們打開資源資料夾中的applicationContext.xml 檔案。它看起來像這樣:(清單 3)
<?xml version="1.0" encoding="UTF-8"?>
<beans  xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:context="http://www.springframework.org/schema/context"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">

    <bean id="javaDeveloper" class="org.example.JavaDevelopment"/>
    <bean id="pythonDeveloper" class="org.example.PythonDevelopment"/>

    <bean id="hiringDepartment" class="org.example.HiringDepartment">
        <constructor-arg ref="javaDeveloper"/>
    </bean>

</beans>
我們記得(或不記得),在 <constructor-arg ref="javaDeveloper"/> 行中,依賴項是使用建構子注入的。現在我們需要為 setter 重寫這一行,如下所示:
<bean id="javaDeveloper" class="org.example.JavaDevelopment"/>
<bean id="pythonDeveloper" class="org.example.PythonDevelopment"/>

<bean id="hiringDepartment" class="org.example.HiringDepartment">
    <property name="development" ref="pythonDeveloper"/> <!--Изменяем только тут-->
</bean>
這裡究竟發生了什麼事?< property name="development" ref="pythonDeveloper"/> 行使用「property」關鍵字透過 setter 注入依賴項。在我們的範例中,Spring 如何找出pythonDeveloper物件需要與哪個 setter 關聯?請注意產生的property="..."值。寫成“發展”。HiringDepartment 檔案中的 setter 稱為setDevelopmentSpring在幕後將development的值轉換為setDevelopment。也就是說,第一個字母變成大寫,並且前綴集 (developmet -> setDevelopment) 放置在單字的開頭。 春天。 第 3 課. 使用 setter 的 DI - 2引擎蓋下是什麼? 我們看到:使用 id javaDeveloper 和 pythonDeveloper 建立了兩個 bean:
<bean id="javaDeveloper" class="org.example.JavaDevelopment"/>
<bean id="pythonDeveloper" class="org.example.PythonDevelopment"/>
實際發生的情況:Spring 創建了 JavaDevelopment 和 PythonDevelopment 類型的兩個物件:
JavaDevelopment javaDevelopment = new JavaDevelopment();
PythonDevelopment pythonDevelopment = new PythonDevelopment();
以下是我們所看到的:建立了一個 id 為 hiringDepartment 的 bean。然後我們上面創建的物件之一的 id 被分配給屬性:
<bean id="hiringDepartment" class="org.example.HiringDepartment">
    <property name="development" ref="pythonDeveloper"/>
</bean>
實際發生的情況:建立了一個 HiringDepartment 類型的物件。然後呼叫該類別的set方法setDevelopment(Developmentdevelopment)。並且 ref 值(已建立的物件的 id)作為參數傳遞:
HiringDepartment hiringDepartment = new HiringDepartment();
hiringDepartment.setDevelopment(pythonDevelopment);
啟動應用程式:
Name: Mike
Job: Middle Python developer
這就是我的全部。感謝您的關注!原始碼位於連結 我的GitHub 購物車 課程內容 待續...
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION