JavaRush/Java блог/Random UA/Spring. Урок 3. DI за допомогою сеттера
Umaralikhon
3 рівень

Spring. Урок 3. DI за допомогою сеттера

Стаття з групи Random UA
учасників
І так... Продовжуємо курс по 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="..." . Воно прописане як "розвиток" . А наш сетер у файлі 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 Віз Зміст курсу Далі буде...
Коментарі
  • популярні
  • нові
  • старі
Щоб залишити коментар, потрібно ввійти в систему
Для цієї сторінки немає коментарів.