І так... Продовжуємо курс по Spring'у. На минулому занятті ми вивчали впровадження залежності за допомогою сеттера. Якщо звернули увагу, тоді ми впроваджували значення з допомогою посилань на id. Тобто використання відбувалося за допомогою атрибуту ref. Виглядало це приблизно так: Лістинг 1
<bean id="javaDeveloper" class="org.example.JavaDevelopment"/>
<bean id="hiringDepartment" class="org.example.HiringDepartment">
<property name="development" ref="javaDeveloper"/>
</bean>
Тут 4 - рядок посилається на id "javaDeveloper", що впроваджує значення класу JavaDevelopment. А якщо ми хочемо впровадити значення вручну або отримати його іншим шляхом, а потім впровадити. Подивимося на прикладі. Кожен співробітник має громадянство і заробітну плату. І нехай ці сутності будуть визначені в класі HiringDepartment. Допустимо так: Лістинг 2
package org.example;
public class HiringDepartment {
private Development development; //Определяем интерфейс
private int salary;
private String citizenship;
public void displayInfo(){
System.out.println("Name: " + development.getName());
System.out.println("Job: " + development.getJob());
}
public void setDevelopment(Development development){
this.development = development;
}
public Development getDevelopment(){
return development;
}
public int getSalary() {
return salary;
}
public void setSalary(int salary) {
this.salary = salary;
}
public String getCitizenship() {
return citizenship;
}
public void setCitizenship(String citizenship) {
this.citizenship = citizenship;
}
}
Тут ми додали 2 поля. int salary і String citizenship . А також визначабо гетери та сеттери для цих об'єктів. Нагадую, що Spring за лаштунками посилається на ці гетери та сеттери для зв'язування значень з об'єктами класу. На решту класів поки що не чіпаємо. А потім переробимо файл applicationContext, у якому визначаються біни наших об'єктів. А це виглядає так: Лістинг 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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<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="javaDeveloper"/>
<property name="citizenship" value="USA"/>
<property name="salary" value="5000"/>
</bean>
</beans>
На відміну від Лістингу 1, сюди були додані ще два property (рядки 12 і 13). Тут у гру входить атрибут value , який визначений усередині тега property. Ще раз нагадую, що значення атрибута name має збігатися з об'єктом, на який посилається бін. А далі Spring самостійно визначає геттери та сеттери за цими значеннями. А за допомогою атрибуту значення впроваджуємо значення для полів. Зауважте, що обидва значення value визначені в лапках, хоча для типу int це незвично. Але Spring як завжди сам визначає, яке значення з яким типом має бути пов'язане. Це відбувається рахунок атрибута name . Назвою бина Spring посилається на об'єкт класу і визначає тип цього об'єкта. Загалом, усе. Тепер залишилося лише перевірити наші оновлення в класі Main: Лістинг 5
package org.example;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
public static void main(String ... args){
//Определяем контекст файл в котором содержатся прописанные нами бины
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//Получем бины, которые были определены в файле applicationContext.xml
HiringDepartment hiringDepartment = context.getBean("hiringDepartment", HiringDepartment.class);
hiringDepartment.displayInfo();
System.out.println("Citizenship: " + hiringDepartment.getCitizenship());
System.out.println("Salary: " + hiringDepartment.getSalary());
context.close(); //Контекст всегда должен закрываться
}
}
Тут особливо нічого міняти не треба. Тільки для отримання результатів викликаємо за допомогою стандартного потоку виведення гетери класу HiringDepartment. В результаті отримуємо наступну відповідь:
Name: Alexa
Job: Middle Java developer
Citizenship: USA
Salary: 5000
Ок. Допустимо у нас 10 таких працівників, які мають таке ж громадянство та отримують таку саму зарплату. І припустимо компанія вирішила підвищити їхні зарплати. Тоді доведеться вручну змінити усі ці 10 значень. Це надто нудно. А якщо визначити ці значення в окремому файлі і зв'язати ці значення з бінами? Тоді нам довелося б лише один раз у цьому файлі змінити значення, а решта бін, які посилаються на це значення, змінабося б автоматично. А спробуємо - як... Для цього зробимо деякі оновлення у структурі проекту та у файлі applicationContext.xml. Спочатку в папці resources додамо новий файл з розширенням .properties . Я назвав цей файл "myApp.properties". Тепер структура проекту набула наступного вигляду: А у файлі пропишемо наступні значення:
employee.citizenship="Russia"
employee.salary=6000
Зліва від знака "=" перебувають назви змінних (якщо їх можна назвати) , а справа значення цих змінних. Назву ви можете дати як завгодно, але як завжди зі змістом. І так, точка тут відіграє стратегічну роль, а не синтаксичну. Припустимо, у нас є і менеджери (manager), теж зі своїми зарплатами. Тоді ми можемо назвати ці змінні приблизно так: manager.salary. Тобто назви змінних не співпадатимуть і заважатимуть один одному. А тепер давайте оновимо файл applicationContext.xml. Перед оголошенням бінів маємо прописати наступний рядок:
<context:property-placeholder location="classpath:myApp.properties"/>
Тут ми визначаємо створений нами файл застосування значень. А потім в атрибут value у подвійних лапках ставимо знак долара $ і у фігурних дужках {} пропишемо назву змінної з файлу myApp.properties:
<property name="salary" value="${employee.salary}"/>
У результаті Spring шукає цю змінну, отримує її значення і прикріплює до об'єкта класу. Повний код виглядає так: Лістинг 6
<?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">
<context:property-placeholder location="classpath:myApp.properties"/>
<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="javaDeveloper"/>
<property name="citizenship" value="${employee.citizenship}"/>
<property name="salary" value="${employee.salary}"/>
</bean>
</beans>
Запускаємо програму:
Name: Alexa
Job: Middle Java developer
Citizenship: "Russia"
Salary: 6000
Як завжди, найкращий спосіб вивчення програмування – це програмувати. Повторюйте вивчене самостійно, спробуйте апдейтувати елементи, пограйтеся з кодом. Коротше, дерзайте. А маю на цьому все. Дякую за увагу! Вихідний код за посиланням Мій GitHub Приєднуйтесь на мій телеграм канал Зміст курсу Далі буде...
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ