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. 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. ¿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á...
GO TO FULL VERSION