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 Приєднуйтесь на мій телеграм канал Зміст курсу Далі буде...
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ