Diferencia entre revisiones de «Inyección de métodos con Spring»

De Dos Ideas.
Saltar a: navegación, buscar
(Página creada con 'Category:Spring Framework ¿Cómo trabajar cuando necesitamos que una clase singleton tenga inyectada una clase prototype?. == La situación == La clase ImperioIrken está…')
 
(La solución: Lookup method injection)
 
(No se muestra una edición intermedia del mismo usuario)
Línea 27: Línea 27:
 
public abstract class ImperioIrken {
 
public abstract class ImperioIrken {
  
   public Object process() {
+
   public Object invadir() {
 
       Invasion invasion = instanciarInvasion();
 
       Invasion invasion = instanciarInvasion();
 
        
 
        
Línea 41: Línea 41:
  
 
<code java>
 
<code java>
 +
<beans>
 
     <bean id="imperioIrken" class="ejemplo.ImperioIrken">
 
     <bean id="imperioIrken" class="ejemplo.ImperioIrken">
 
           <lookup-method name="instanciarInvasion" bean="invasion"/>
 
           <lookup-method name="instanciarInvasion" bean="invasion"/>
Línea 46: Línea 47:
  
 
     <bean id="invasion" class="ejemplo.Invasion" scope="prototype"/>
 
     <bean id="invasion" class="ejemplo.Invasion" scope="prototype"/>
 +
</beans>
 
</code>
 
</code>
  

Revisión actual del 13:28 27 nov 2009

¿Cómo trabajar cuando necesitamos que una clase singleton tenga inyectada una clase prototype?.

La situación

La clase ImperioIrken está declarada como un Singleton. La clase Invasion, inyectada como dependencia, es stateful y por ello queremos que tenga el comportamiento de un Prototype:

<beans>

    <bean id="imperioIrken" class="ejemplo.ImperioIrken">
       <property name="invasion" ref="invasion"/>
    </bean>
    <bean id="invasion" class="ejemplo.Invasion" scope="prototype"/>

</beans>


El problema

La clase ImperioIrken es un singleton, por lo tanto la factory de spring la instancia sólo una vez y le inyecta una instancia de la clase Invasion. Luego, todas las veces que usemos ImperioIrken nos retorna la única instancia existente de la clase. Y por ello no se crean nuevas instancias de la clase Invasion a pesar de que el bean tiene seteado el scope prototype.

La solución: Lookup method injection

Spring nos provee como solución definir en la clase singleton un método abstracto para la creación de los beans de la clase stateful (el método abstracto será implementado dinámicamente).

public abstract class ImperioIrken {

  public Object invadir() {
     Invasion invasion = instanciarInvasion();
     
     // continuamos con la lógica...
  }
  protected abstract Invasion instanciarInvasion();

}

En el archivo de definición de beans usamos el tag lookup-method, para lograr obtener una instancia nueva de la clase Invasion cada vez:

<beans>

    <bean id="imperioIrken" class="ejemplo.ImperioIrken">
         <lookup-method name="instanciarInvasion" bean="invasion"/>
    </bean>
    <bean id="invasion" class="ejemplo.Invasion" scope="prototype"/>

</beans>

Ver también