І так... Продовжуємо курс по 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="..." . Воно прописане як "розвиток" . А наш сетер у файлі 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 Віз Зміст курсу Далі буде...