JavaRush /จาวาบล็อก /Random-TH /ฤดูใบไม้ผลิ. บทที่ 4: คุณลักษณะค่าสำหรับการฝังค่า
Umaralikhon
ระดับ
Красноярск

ฤดูใบไม้ผลิ. บทที่ 4: คุณลักษณะค่าสำหรับการฝังค่า

เผยแพร่ในกลุ่ม
ดังนั้น... เราจึงเดินทางต่อในฤดูใบไม้ผลิ ใน บทเรียน สุดท้ายเราศึกษา dependency injection โดยใช้ setter หากคุณสังเกตเห็น แสดงว่าเรานำค่าต่างๆ ไปใช้โดยใช้ลิงก์ไปยัง id นั่นคือการใช้งานเกิดขึ้นโดยใช้แอตทริบิวต์การอ้างอิง มีลักษณะดังนี้: รายการที่ 1

<bean id="javaDeveloper" class="org.example.JavaDevelopment"/>

<bean id="hiringDepartment" class="org.example.HiringDepartment">
        <property name="development" ref="javaDeveloper"/>
</bean>
ที่นี่ 4 - บรรทัดอ้างถึงรหัส "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และสัญชาติString เรายังกำหนด getters และ setters สำหรับอ็อบเจ็กต์เหล่านี้ด้วย เพื่อเป็นการเตือนความจำ Spring อ้างถึง getters และ setters เหล่านี้เบื้องหลังเพื่อผูกค่าเข้ากับคลาสอ็อบเจ็กต์ เรายังไม่ได้สัมผัสชั้นเรียนอื่นเลย จากนั้นเราจะทำซ้ำไฟล์ applicationContext ซึ่งกำหนด bean สำหรับอ็อบเจ็กต์ของเรา และมีลักษณะดังนี้: รายการ 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 ตรงที่มีการเพิ่มคุณสมบัติอีกสองรายการที่นี่ (บรรทัดที่ 12 และ 13) นี่คือจุดที่ แอตทริบิวต์value เข้ามามีบทบาท ซึ่งกำหนดไว้ภายในแท็กคุณสมบัติ ฉันขอเตือนคุณอีกครั้งว่าค่าของแอตทริบิวต์ name จะต้องตรงกับวัตถุที่ bean อ้างถึง จากนั้น Spring จะกำหนด getters และ setters อย่างอิสระโดยใช้ค่าเหล่านี้ และการใช้ แอตทริบิวต์ ค่าเราจะใช้ค่าสำหรับฟิลด์ โปรดทราบว่าค่าทั้งสองค่าถูกกำหนดไว้ในเครื่องหมายคำพูด แม้ว่าจะเป็นเรื่องปกติสำหรับประเภท int ก็ตาม แต่ Spring จะเป็นตัวกำหนดว่าค่าใดควรเชื่อมโยงกับประเภทใดเช่นเคย สิ่ง นี้เกิดขึ้นเนื่องจาก แอตทริบิวต์ ชื่อ ตามชื่อของ bean นั้น Spring หมายถึงอ็อบเจ็กต์ของคลาสและกำหนดประเภทของอ็อบเจ็กต์นี้ นั่นคือทั้งหมดที่ ตอนนี้สิ่งที่เหลืออยู่คือการตรวจสอบการอัปเดตของเราในคลาสหลัก: รายการ 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(); //Контекст всегда должен закрываться
    }
}
ไม่จำเป็นต้องเปลี่ยนแปลงอะไรมากที่นี่ เพื่อให้ได้ผลลัพธ์เท่านั้น เราจึงเรียก getters ของคลาส HiringDepartment โดยใช้เอาต์พุตสตรีมมาตรฐาน เป็นผลให้เราได้รับคำตอบดังนี้:

Name: Alexa
Job: Middle Java developer
Citizenship: USA
Salary: 5000
ตกลง. สมมติว่าเรามีพนักงานดังกล่าว 10 คนซึ่งมีสัญชาติเดียวกันและได้รับเงินเดือนเท่ากัน และสมมติว่าบริษัทตัดสินใจเพิ่มเงินเดือน จากนั้นคุณจะต้องเปลี่ยนค่าทั้ง 10 เหล่านี้ด้วยตนเอง มันน่าเบื่อเกินไป จะเกิดอะไรขึ้นถ้าเรากำหนดค่าเหล่านี้ในไฟล์แยกต่างหากและเชื่อมโยงค่าเหล่านี้กับ bean? จากนั้นเราจะต้องเปลี่ยนค่าเพียงครั้งเดียวในไฟล์นี้ และ bean ที่เหลือที่อ้างอิงค่านี้จะเปลี่ยนโดยอัตโนมัติ ลองทำดู... ในการดำเนินการนี้ เราจะทำการอัปเดตบางอย่างในโครงสร้างโปรเจ็กต์และในไฟล์ applicationContext.xml ขั้นแรก ในโฟลเดอร์ทรัพยากร ให้เพิ่มไฟล์ใหม่ที่มีนามสกุล. properties ฉันตั้งชื่อไฟล์นี้ว่า "myApp.properties" ตอนนี้โครงสร้างโครงการอยู่ในรูปแบบต่อไปนี้: ฤดูใบไม้ผลิ.  บทที่ 4 แอตทริบิวต์ค่าสำหรับการฝังค่า - 1 และในไฟล์เราจะเขียนค่าต่อไปนี้:

employee.citizenship="Russia"
employee.salary=6000
ทางด้านซ้ายของเครื่องหมาย "=" คือชื่อของตัวแปร (หากสามารถเรียกแบบนั้นได้) และทางด้านขวาคือค่าของตัวแปรเหล่านี้ คุณสามารถตั้งชื่ออะไรก็ได้ตามต้องการ แต่ตามปกติแล้วให้มีความหมาย ใช่แล้ว ช่วงเวลานี้มีบทบาทเชิงกลยุทธ์ ไม่ใช่เชิงวากยสัมพันธ์ สมมติว่าเรายังมีผู้จัดการซึ่งมีเงินเดือนเป็นของตัวเองด้วย จากนั้นเราก็สามารถตั้งชื่อตัวแปรเหล่านี้ได้ดังนี้: manager.salary นั่นคือชื่อของตัวแปรจะไม่ตรงกันและรบกวนซึ่งกันและกัน ตอนนี้เรามาอัปเดตไฟล์ applicationContext.xml กันดีกว่า ก่อนที่จะประกาศ bean คุณต้องเขียนบรรทัดต่อไปนี้:

<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 ของฉัน เข้าร่วมช่องโทรเลข ของฉัน เนื้อหาหลักสูตร เพื่อดำเนินการต่อ...
ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION