JavaRush /Blog Java /Random-ES /Primavera. Lección 4: El atributo de valor para incrustar...
Umaralikhon
Nivel 3
Красноярск

Primavera. Lección 4: El atributo de valor para incrustar valores

Publicado en el grupo Random-ES
Y así... Seguimos nuestro rumbo en Primavera. En la última lección estudiamos la inyección de dependencia usando un definidor. Si lo notó, implementamos valores usando enlaces a id. Es decir, la implementación se realizó utilizando el atributo ref. Se parecía a esto: Listado 1
<bean id="javaDeveloper" class="org.example.JavaDevelopment"/>

<bean id="hiringDepartment" class="org.example.HiringDepartment">
        <property name="development" ref="javaDeveloper"/>
</bean>
Aquí la línea 4 se refiere al id "javaDeveloper", que implementa el valor de la clase JavaDevelopment. ¿Qué pasa si queremos inyectar los valores manualmente o obtenerlos de otra manera y luego inyectarlos? Veamos un ejemplo. Cada empleado tiene una ciudadanía y un salario. Y dejemos que estas entidades se definan en la clase HiringDepartment. Digamos esto: Listado 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;
    }
}
Aquí hemos agregado 2 campos. Salario int y ciudadanía String . También definimos captadores y definidores para estos objetos. Como recordatorio, Spring se refiere a estos captadores y definidores detrás de escena para vincular valores a objetos de clase. Aún no tocamos otras clases. Y luego reharemos el archivo applicationContext, que define los beans para nuestros objetos. Y se ve así: Listado 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>
A diferencia del Listado 1, aquí se han agregado dos propiedades más (líneas 12 y 13). Aquí es donde entra en juego el atributo de valor , que se define dentro de la etiqueta de propiedad. Permítanme recordarles una vez más que el valor del atributo de nombre debe coincidir con el objeto al que se refiere el bean. Y luego Spring determina de forma independiente los captadores y definidores utilizando estos valores. Y usando el atributo value implementamos valores para los campos. Tenga en cuenta que ambos valores se definen entre comillas, aunque esto es inusual para el tipo int. Pero Spring, como siempre, determina qué valor debe asociarse con qué tipo. Esto sucede debido al atributo de nombre . Con el nombre del bean, Spring se refiere a un objeto de la clase y determina el tipo de este objeto. Bueno eso es todo. Ahora sólo queda comprobar nuestras actualizaciones en la clase Principal: Listado 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(); //Контекст всегда должен закрываться
    }
}
No hay necesidad de cambiar mucho aquí. Sólo para obtener resultados llamamos a los captadores de la clase HiringDepartment utilizando el flujo de salida estándar. Como resultado, obtenemos la siguiente respuesta:
Name: Alexa
Job: Middle Java developer
Citizenship: USA
Salary: 5000
DE ACUERDO. Digamos que tenemos 10 de esos empleados que tienen la misma ciudadanía y reciben el mismo salario. Y digamos que la empresa decidió aumentar sus salarios. Luego tendrás que cambiar manualmente estos 10 valores. Es muy aburrido. ¿Qué pasa si definimos estos valores en un archivo separado y los asociamos con beans? Entonces sólo tendríamos que cambiar el valor una vez en este archivo, y los beans restantes que hacen referencia a este valor cambiarían automáticamente. Probémoslo... Para hacer esto, haremos algunas actualizaciones en la estructura del proyecto y en el archivo applicationContext.xml. Primero, en la carpeta de recursos, agregue un nuevo archivo con la extensión .properties . Llamé a este archivo "myApp.properties". Ahora la estructura del proyecto ha tomado la siguiente forma: Primavera.  Lección 4. El atributo de valor para incrustar valores - 1 Y en el archivo escribiremos los siguientes valores:
employee.citizenship="Russia"
employee.salary=6000
A la izquierda del signo "=" están los nombres de las variables (si se pueden llamar así), y a la derecha están los valores de estas variables. Puedes ponerle el nombre como quieras, pero como siempre, con significado. Y sí, el punto aquí juega un papel estratégico, no sintáctico. Digamos que también tenemos gerentes, también con sus propios salarios. Luego podemos simplemente nombrar estas variables de la siguiente manera: gerente.salario. Es decir, los nombres de las variables no coincidirán ni interferirán entre sí. Ahora actualicemos el archivo applicationContext.xml. Antes de declarar beans, debes escribir la siguiente línea:
<context:property-placeholder location="classpath:myApp.properties"/>
Aquí definimos el archivo que creamos para incrustar los valores. Y luego en el atributo value ponemos un signo de dólar $ entre comillas dobles y entre llaves {} escribimos el nombre de la variable del archivo myApp.properties:
<property name="salary" value="${employee.salary}"/>
Como resultado, Spring busca esta variable, obtiene su valor y lo adjunta al objeto de clase. El código completo se ve así: Listado 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>
Iniciemos el programa:
Name: Alexa
Job: Middle Java developer
Citizenship: "Russia"
Salary: 6000
Como siempre, la mejor manera de aprender a programar es programar. Repite lo que has aprendido tú mismo, intenta actualizar elementos, juega con el código. En resumen, adelante. Y eso es todo para mí. ¡Gracias por su atención! Código fuente en el enlace Mi GitHub Únase a mi canal de Telegram Contenido del curso Continuará...
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION