И так... Продолжаем курс по Spring'у. На прошлом занятии мы познакомились как внедрять зависимости с помощью конструктора класса. А теперь пора познакомить вас с другим методом внедрения зависимостей - с помощью сеттера. Для восстановления памяти о предыдущих уроках покажу структуру нашей программы. Spring. Урок 3. DI с помощью сеттера - 1 Нас интересует только файлы HiringDepartment и applicationContext. Они управляют нашим проектом. Их будем переделывать. Это старый код файла HiringDepartment: (Листинг 1)

package org.example;

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

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

    public void displayInfo(){
        System.out.println("Name: " + development.getName());
        System.out.println("Job: " + development.getJob());
    }
}
Как видим тут для инициализации объекта типа Development используется конструктор. Убираем этот конструктор (или оставляем, без разниц). И пропишем сеттер, как в следующем примере: (Листинг 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 в папке resources. Он имеет следующий вид: (Листинг 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"/> внедряется зависимость с помощью конструктора. Теперь нам необходимо переписать эту строку для сеттера, как показано ниже:

    <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" внедряется зависимость с помощью сеттера. А как Spring узнал с каким именно сеттером нужно связать в нашем примере объект pythonDeveloper. Обратите внимание на получаемое значение property="...". Оно прописано как "development". А наш сеттер в файле HiringDepartment называется setDevelopment. Spring за кулисами преобразует значение development в setDevelopment. То есть первая буква становится заглавной и в начало слова ставится префикс set (developmet -> setDevelopment). Spring. Урок 3. DI с помощью сеттера - 2А что под капотом? Что мы видим: Создаются два бина с id javaDeveloper и pythonDeveloper:

 <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. Затем в property присваивается id одного из наших выше созданных объектов:

<bean id="hiringDepartment" class="org.example.HiringDepartment">
    <property name="development" ref="pythonDeveloper"/>
</bean>
А что происходит на самом деле: Создается объект типа HiringDepartment. Затем вызывается сет - метод этого класса setDevelopment(Development development). А в качестве аргумента передается значение ref (id созданных объектов):

HiringDepartment hiringDepartment = new HiringDepartment();
hiringDepartment.setDevelopment(pythonDevelopment);
Запускаем приложение:

Name: Mike
Job: Middle Python developer
На этом у меня всё. Благодарю за внимание! Исходной код по ссылке Мой GitHub Телега Содержание курса Продолжение следует...