И так...
Продолжаем курс по Spring'у. На прошлом занятии мы познакомились как внедрять зависимости с помощью конструктора класса. А теперь пора познакомить вас с другим методом внедрения зависимостей - с помощью сеттера.
Для восстановления памяти о предыдущих уроках покажу структуру нашей программы.
Нас интересует только файлы 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).
А что под капотом?
Что мы видим: Создаются два бина с 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
Телега
Содержание курса
Продолжение следует...
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ