JavaRush /Java 博客 /Random-ZH /春天。第 3 课:使用 setter 进行 DI
Umaralikhon
第 3 级
Красноярск

春天。第 3 课:使用 setter 进行 DI

已在 Random-ZH 群组中发布
所以...我们继续我们的春季课程。上一课中,我们学习了如何使用类构造函数注入依赖项。现在是时候向您介绍另一种依赖注入方法 - 使用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