Inyección de dependencia basada en Spring Setter

La DI basada en Setter se logra mediante el contenedor que llama a los métodos de setter en sus beans después de invocar un constructor sin argumentos o un método de fábrica estático sin argumentos para crear una instancia de su bean.

Ejemplo

El siguiente ejemplo muestra una clase TextEditor que solo se puede inyectar por dependencia usando una inyección pura basada en setter.

Tengamos un IDE de Eclipse en funcionamiento y sigamos los siguientes pasos para crear una aplicación Spring:

Pasos Descripción
1 Cree un proyecto con un nombre SpringExample y cree un paquete com.tutorialspoint bajo elsrc carpeta en el proyecto creado.
2 Agregue las bibliotecas Spring requeridas usando la opción Agregar JAR externos como se explica en el capítulo Ejemplo de Spring Hello World .
3 Crear clases de Java TextEditor , corrector ortográfico y MainApp bajo la com.tutorialspoint paquete.
4 Cree el archivo de configuración de Beans Beans.xml bajo elsrc carpeta.
5 El paso final es crear el contenido de todos los archivos Java y el archivo de configuración de Bean y ejecutar la aplicación como se explica a continuación.

Aquí está el contenido de TextEditor.java archivo -

package com.tutorialspoint;

public class TextEditor {
   private SpellChecker spellChecker;

   // a setter method to inject the dependency.
   public void setSpellChecker(SpellChecker spellChecker) {
      System.out.println("Inside setSpellChecker." );
      this.spellChecker = spellChecker;
   }
   // a getter method to return spellChecker
   public SpellChecker getSpellChecker() {
      return spellChecker;
   }
   public void spellCheck() {
      spellChecker.checkSpelling();
   }
}

Aquí debe verificar la convención de nomenclatura de los métodos de establecimiento. Para establecer una variablespellChecker estamos usando setSpellChecker()método que es muy similar a las clases de Java POJO. Creemos el contenido de otro archivo de clase dependienteSpellChecker.java -

package com.tutorialspoint;

public class SpellChecker {
   public SpellChecker(){
      System.out.println("Inside SpellChecker constructor." );
   }
   public void checkSpelling() {
      System.out.println("Inside checkSpelling." );
   }
}

A continuación se muestra el contenido de la MainApp.java archivo -

package com.tutorialspoint;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainApp {
   public static void main(String[] args) {
      ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");

      TextEditor te = (TextEditor) context.getBean("textEditor");
      te.spellCheck();
   }
}

A continuación se muestra el archivo de configuración Beans.xml que tiene configuración para la inyección basada en incubadoras -

<?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-3.0.xsd">

   <!-- Definition for textEditor bean -->
   <bean id = "textEditor" class = "com.tutorialspoint.TextEditor">
      <property name = "spellChecker" ref = "spellChecker"/>
   </bean>

   <!-- Definition for spellChecker bean -->
   <bean id = "spellChecker" class = "com.tutorialspoint.SpellChecker"></bean>

</beans>

Debe notar la diferencia en el archivo Beans.xml definido en la inyección basada en constructor y la inyección basada en setter. La única diferencia está dentro del elemento <bean> donde hemos usado etiquetas <constructor-arg> para la inyección basada en constructor y etiquetas <property> para la inyección basada en establecedores.

El segundo punto importante a tener en cuenta es que, en caso de que esté pasando una referencia a un objeto, debe usar ref atributo de la etiqueta <property> y si está pasando un value directamente, entonces debe usar el atributo de valor.

Una vez que haya terminado de crear los archivos de configuración de fuente y bean, ejecutemos la aplicación. Si todo está bien con su aplicación, esto imprimirá el siguiente mensaje:

Inside SpellChecker constructor.
Inside setSpellChecker.
Inside checkSpelling.

Configuración XML usando p-namespace

Si tiene muchos métodos de establecimiento, entonces es conveniente usar p-namespaceen el archivo de configuración XML. Comprobemos la diferencia -

Consideremos el ejemplo de un archivo de configuración XML estándar con etiquetas <property> -

<?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-3.0.xsd">

   <bean id = "john-classic" class = "com.example.Person">
      <property name = "name" value = "John Doe"/>
      <property name = "spouse" ref = "jane"/>
   </bean>

   <bean name = "jane" class = "com.example.Person">
      <property name = "name" value = "John Doe"/>
   </bean>

</beans>

La configuración XML anterior se puede reescribir de una manera más limpia usando p-namespace de la siguiente manera:

<?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:p = "http://www.springframework.org/schema/p"
   xsi:schemaLocation = "http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

   <bean id = "john-classic" class = "com.example.Person"
      p:name = "John Doe"
      p:spouse-ref = "jane"/>
   </bean>

   <bean name =" jane" class = "com.example.Person"
      p:name = "John Doe"/>
   </bean>

</beans>

Aquí, debe notar la diferencia al especificar valores primitivos y referencias a objetos con p-namespace. los-ref parte indica que este no es un valor directo sino más bien una referencia a otro bean.