JavaRush /Blog Java /Random-PL /Wiosna. Lekcja 4: Atrybut wartości do osadzania wartości
Umaralikhon
Poziom 3
Красноярск

Wiosna. Lekcja 4: Atrybut wartości do osadzania wartości

Opublikowano w grupie Random-PL
I tak... Kontynuujemy nasz kurs na wiosnę. Na ostatniej lekcji omawialiśmy wstrzykiwanie zależności za pomocą settera. Jeśli zauważyłeś, to zaimplementowaliśmy wartości za pomocą linków do id. Oznacza to, że implementacja odbyła się przy użyciu atrybutu ref. Wyglądało to mniej więcej tak: Listing 1
<bean id="javaDeveloper" class="org.example.JavaDevelopment"/>

<bean id="hiringDepartment" class="org.example.HiringDepartment">
        <property name="development" ref="javaDeveloper"/>
</bean>
Tutaj 4 - linia odnosi się do identyfikatora „javaDeveloper”, który implementuje wartość klasy JavaDevelopment. A co jeśli chcemy wstrzyknąć wartości ręcznie lub uzyskać je w inny sposób, a następnie wstrzyknąć. Spójrzmy na przykład. Każdy pracownik ma obywatelstwo i wynagrodzenie. I niech te podmioty zostaną zdefiniowane w klasie HiringDepartment. Powiedzmy tak: Listing 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;
    }
}
Tutaj dodaliśmy 2 pola. int wynagrodzenie i obywatelstwo String . Zdefiniowaliśmy także metody pobierające i ustawiające dla tych obiektów. Dla przypomnienia, Spring odwołuje się do tych getterów i setterów za kulisami, aby powiązać wartości z obiektami klas. Nie poruszamy jeszcze innych klas. Następnie ponownie wykonamy plik applicationContext, który definiuje komponenty fasoli dla naszych obiektów. A 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"
        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>
W przeciwieństwie do Listingu 1, dodano tu jeszcze dwie właściwości (linie 12 i 13). W tym miejscu wchodzi w grę atrybut wartości , który jest zdefiniowany wewnątrz znacznika właściwości. Przypominam jeszcze raz, że wartość atrybutu name musi odpowiadać obiektowi, do którego odnosi się komponent bean. Następnie Spring niezależnie określa metody pobierające i ustawiające, używając tych wartości. A za pomocą atrybutu value implementujemy wartości dla pól. Należy pamiętać, że obie wartości wartości są podane w cudzysłowie, chociaż jest to nietypowe w przypadku typu int. Ale Spring, jak zawsze, określa, która wartość powinna być powiązana z jakim typem. Dzieje się tak ze względu na atrybut name . Spring poprzez nazwę komponentu odwołuje się do obiektu klasy i określa typ tego obiektu. Cóż, to wszystko. Teraz pozostaje tylko sprawdzić nasze aktualizacje w klasie Main: Listing 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(); //Контекст всегда должен закрываться
    }
}
Tutaj nie trzeba wiele zmieniać. Tylko w celu uzyskania wyników wywołujemy gettery klasy HiringDepartment przy użyciu standardowego strumienia wyjściowego. W rezultacie otrzymujemy następującą odpowiedź:
Name: Alexa
Job: Middle Java developer
Citizenship: USA
Salary: 5000
OK. Załóżmy, że mamy 10 takich pracowników, którzy mają to samo obywatelstwo i otrzymują takie samo wynagrodzenie. Załóżmy, że firma zdecydowała się na podwyżkę wynagrodzeń. Następnie będziesz musiał ręcznie zmienić wszystkie te 10 wartości. To zbyt nudne. A co jeśli zdefiniujemy te wartości w osobnym pliku i powiążemy te wartości z fasolą? Wtedy musielibyśmy tylko raz zmienić wartość w tym pliku, a pozostałe komponenty fasoli odwołujące się do tej wartości zmieniłyby się automatycznie. Spróbujmy... W tym celu dokonamy aktualizacji w strukturze projektu oraz w pliku applicationContext.xml. Najpierw w folderze Resources dodaj nowy plik z rozszerzeniem .properties . Nazwałem ten plik „myApp.properties”. Teraz struktura projektu przyjęła następującą postać: Wiosna.  Lekcja 4. Atrybut wartości do osadzania wartości - 1 A w pliku zapiszemy następujące wartości:
employee.citizenship="Russia"
employee.salary=6000
Na lewo od znaku „=” znajdują się nazwy zmiennych (jeśli można je tak nazwać), a po prawej stronie wartości tych zmiennych. Imię możesz nadać jakie chcesz, ale jak zwykle z znaczeniem. I tak, kropka odgrywa tutaj rolę strategiczną, a nie syntaktyczną. Powiedzmy, że mamy także menedżerów, również z własnymi pensjami. Następnie możemy po prostu nazwać te zmienne mniej więcej tak: manager.salary. Oznacza to, że nazwy zmiennych nie będą się pokrywać i kolidować ze sobą. Teraz zaktualizujmy plik applicationContext.xml. Przed zadeklarowaniem fasoli musisz napisać następujący wiersz:
<context:property-placeholder location="classpath:myApp.properties"/>
Tutaj definiujemy plik, który utworzyliśmy w celu osadzenia wartości. Następnie w atrybucie value umieszczamy znak dolara $ w cudzysłowie, a w nawiasach klamrowych {} wpisujemy nazwę zmiennej z pliku myApp.properties:
<property name="salary" value="${employee.salary}"/>
W rezultacie Spring wyszukuje tę zmienną, pobiera jej wartość i dołącza ją do obiektu klasy. Kompletny kod wygląda następująco: Listing 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>
Uruchommy program:
Name: Alexa
Job: Middle Java developer
Citizenship: "Russia"
Salary: 6000
Jak zawsze, najlepszą metodą nauki programowania jest programowanie. Powtarzaj samodzielnie to, czego się nauczyłeś, spróbuj zaktualizować elementy, pobaw się kodem. Krótko mówiąc, idź na całość. I to wszystko dla mnie. Dziękuję za uwagę! Kod źródłowy pod linkiem Mój GitHub Dołącz do mojego kanału telegramowego Treść kursu Ciąg dalszy...
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION