JavaRush/Java блог/Random UA/Spring. Урок 4. Атрибут value для застосування значень
Umaralikhon
3 рівень

Spring. Урок 4. Атрибут value для застосування значень

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