JavaRush /Java 博客 /Random-ZH /春天。第 4 课:嵌入值的 value 属性
Umaralikhon
第 3 级
Красноярск

春天。第 4 课:嵌入值的 value 属性

已在 Random-ZH 群组中发布
所以...我们继续我们的春季课程。上一课中,我们研究了使用 setter 的依赖注入。如果您注意到了,那么我们使用 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 工资字符串 公民身份。我们还为这些对象定义了 getter 和 setter。提醒一下,Spring 在幕后引用这些 getter 和 setter 将值绑定到类对象。我们还没有接触其他类。然后我们将重做 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属性发挥作用的地方,它是在 property 标记内定义的。让我再次提醒您,name 属性的值必须与 bean 引用的对象相匹配。然后 Spring 使用这些值独立确定 getter 和 setter。并使用value属性我们实现字段的值。请注意,这两个值都用引号定义,尽管这对于 int 类型来说并不常见。但 Spring 一如既往地决定哪个值应该与哪个类型相关联。这是由于name属性而发生的。Spring通过bean的名称来引用该类的一个对象并确定该对象的类型。嗯,仅此而已。现在剩下的就是检查 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 类的 getter。结果,我们得到以下答案:
Name: Alexa
Job: Middle Java developer
Citizenship: USA
Salary: 5000
好的。假设我们有 10 名这样的员工,他们拥有相同的公民身份并领取相同的工资。假设公司决定增加他们的工资。然后您必须手动更改所有这 10 个值。太无聊了。如果我们在单独的文件中定义这些值并将这些值与bean关联起来会怎么样?然后我们只需要在此文件中更改一次值,引用该值的其余 bean 将自动更改。让我们尝试一下... 为此,我们将在项目结构和 applicationContext.xml 文件中进行一些更新。首先,在资源文件夹中添加一个扩展名为.properties的新文件。我将此文件命名为“myApp.properties”。现在项目结构已采用以下形式: 春天。 第 4 课. 嵌入值的 value 属性 - 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