JavaRush /Blog Java /Random-ES /Primavera. Lección 3. DI usando setter
Umaralikhon
Nivel 3
Красноярск

Primavera. Lección 3. DI usando setter

Publicado en el grupo Random-ES
Y así... Seguimos nuestro rumbo en Primavera. En la última lección aprendimos cómo inyectar dependencias usando un constructor de clases. Ahora es el momento de presentarle otro método de inyección de dependencia: utilizar un definidor . Para recuperar la memoria de lecciones anteriores, le mostraré la estructura de nuestro programa. Primavera.  Lección 3. DI usando setter - 1 Solo estamos interesados ​​en los archivos HiringDepartment y applicationContext. Ellos gestionan nuestro proyecto. Los reharemos. Este es el código antiguo para el archivo HiringDepartment: (Listado 1)
package org.example;

public class HiringDepartment {
    private Development development; //Определяем интерфейс

    //Конструктор принимает un objeto интерфейса
    public HiringDepartment(Development development){
        this.development = development;
    }

    public void displayInfo(){
        System.out.println("Name: " + development.getName());
        System.out.println("Job: " + development.getJob());
    }
}
Como vemos aquí, se utiliza un constructor para inicializar un objeto de tipo Desarrollo. Eliminamos este constructor (o lo dejamos, no importa). Y escribamos un setter, como en el siguiente ejemplo: (Listado 2)
package org.example;

public class HiringDepartment {
    private Development development; //Определяем интерфейс

//Вместо конструктора используем сеттер
    public void setDevelopment(Development development){
        this.development = development;
    }

    public void displayInfo(){
        System.out.println("Name: " + development.getName());
        System.out.println("Job: " + development.getJob());
    }
}
Ahora abramos el archivo applicationContext.xml en la carpeta de recursos. 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"
        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">

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

    <bean id="hiringDepartment" class="org.example.HiringDepartment">
        <constructor-arg ref="javaDeveloper"/>
    </bean>

</beans>
Como recordamos (o no recordamos), en la línea <constructor-arg ref="javaDeveloper"/> se inyecta la dependencia mediante el constructor. Ahora necesitamos reescribir esta línea para el configurador como se muestra a continuación:
<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="pythonDeveloper"/> <!--Изменяем только тут-->
</bean>
Qué está pasando aquí? La línea <property name="development" ref="pythonDeveloper"/> usa la palabra clave " property " para inyectar la dependencia usando un definidor. ¿Cómo descubrió Spring con qué definidor debe asociarse el objeto pythonDeveloper en nuestro ejemplo ? Tenga en cuenta el valor resultante de la propiedad="..." . Está escrito como "desarrollo" . Y nuestro configurador en el archivo HiringDepartment se llama setDevelopment . Spring convierte el valor del desarrollo en setDevelopment detrás de escena . Es decir, la primera letra se escribe en mayúscula y el prefijo set (developmet -> setDevelopment) se coloca al principio de la palabra. Primavera.  Lección 3. DI usando setter - 2¿Qué hay debajo del capó? Lo que vemos: Se crean dos beans con id javaDeveloper y pythonDeveloper:
<bean id="javaDeveloper" class="org.example.JavaDevelopment"/>
<bean id="pythonDeveloper" class="org.example.PythonDevelopment"/>
Lo que realmente sucede: Spring crea dos objetos de tipo JavaDevelopment y PythonDevelopment:
JavaDevelopment javaDevelopment = new JavaDevelopment();
PythonDevelopment pythonDevelopment = new PythonDevelopment();
Y esto es lo que vemos: se crea un bean con id. Departamento de contratación. Luego, la identificación de uno de nuestros objetos creados anteriormente se asigna a la propiedad:
<bean id="hiringDepartment" class="org.example.HiringDepartment">
    <property name="development" ref="pythonDeveloper"/>
</bean>
Qué sucede realmente: se crea un objeto de tipo HiringDepartment. Luego se llama al método set de esta clase setDevelopment(Desarrollo de desarrollo). Y el valor de referencia (id de los objetos creados) se pasa como argumento:
HiringDepartment hiringDepartment = new HiringDepartment();
hiringDepartment.setDevelopment(pythonDevelopment);
Iniciar la aplicacion:
Name: Mike
Job: Middle Python developer
Eso es todo lo que tengo. ¡Gracias por su atención! Código fuente en el enlace Mi carrito de GitHub Contenido del curso Continuará...
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION