I tak... Kontynuujemy nasz kurs na wiosnę. Na ostatniej lekcji nauczyliśmy się wstrzykiwać zależności za pomocą konstruktora klasy. Teraz czas przedstawić Ci inną metodę wstrzykiwania zależności - użycie settera . Aby przywrócić pamięć poprzednich lekcji, pokażę Ci strukturę naszego programu. Interesują nas tylko pliki HiringDepartment i applicationContext. Zarządzają naszym projektem. Zrobimy je ponownie. To jest stary kod pliku HiringDepartment: (Listing 1)
package org.example;
public class HiringDepartment {
private Development development; //Определяем интерфейс
//Конструктор принимает obiekt интерфейса
public HiringDepartment(Development development){
this.development = development;
}
public void displayInfo(){
System.out.println("Name: " + development.getName());
System.out.println("Job: " + development.getJob());
}
}
Jak widać, konstruktor służy do inicjowania obiektu typu Development. Usuwamy tego konstruktora (lub zostawiamy, nie ma to znaczenia). I napiszmy settera, jak w poniższym przykładzie: (Listing 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());
}
}
Otwórzmy teraz plik applicationContext.xml w folderze Resources. Wygląda to tak: (Listing 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>
Jak pamiętamy (lub nie pamiętamy), w linii <constructor-arg ref="javaDeveloper"/> zależność jest wstrzykiwana za pomocą konstruktora. Teraz musimy przepisać tę linię dla settera, jak pokazano poniżej:
<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>
Co dokładnie się tutaj dzieje? Linia <property name="development" ref="pythonDeveloper"/> używa słowa kluczowego " property " do wstrzyknięcia zależności za pomocą metody ustawiającej. W jaki sposób Spring dowiedział się, z którym ustawieniem należy powiązać obiekt PythonDeveloper w naszym przykładzie ? Zanotuj wynikową wartość property="..." . Jest napisane jako „rozwój” . A nasz program ustawiający w pliku HiringDepartment nazywa się setDevelopment . Wiosna przekształca wartość rozwoju w rozwój za kulisami . Oznacza to, że pierwsza litera jest wielka, a zestaw przedrostków (developmet -> setDevelopment) jest umieszczany na początku słowa. Co kryje się pod maską? Co widzimy: Tworzone są dwa komponenty bean o identyfikatorach javaDeveloper i pythonDeveloper:
<bean id="javaDeveloper" class="org.example.JavaDevelopment"/>
<bean id="pythonDeveloper" class="org.example.PythonDevelopment"/>
Co się właściwie dzieje: Spring tworzy dwa obiekty typu JavaDevelopment i PythonDevelopment:
JavaDevelopment javaDevelopment = new JavaDevelopment();
PythonDevelopment pythonDevelopment = new PythonDevelopment();
A oto co widzimy: Tworzony jest komponent bean o identyfikatorze HiringDepartment. Następnie do właściwości przypisywany jest identyfikator jednego z utworzonych przez nas obiektów:
<bean id="hiringDepartment" class="org.example.HiringDepartment">
<property name="development" ref="pythonDeveloper"/>
</bean>
Co się właściwie dzieje: Tworzony jest obiekt typu HiringDepartment. Następnie wywoływana jest metoda set tej klasy setDevelopment(Rozwój programistyczny). Wartość ref (identyfikator utworzonych obiektów) jest przekazywana jako argument:
HiringDepartment hiringDepartment = new HiringDepartment();
hiringDepartment.setDevelopment(pythonDevelopment);
Uruchom aplikację:
Name: Mike
Job: Middle Python developer
To wszystko co mam. Dziękuję za uwagę! Kod źródłowy pod linkiem Mój koszyk GitHub Treść kursu Ciąg dalszy...
GO TO FULL VERSION