miércoles, 4 de febrero de 2009

Inyección de métodos en Spring (method injection) parte 2

Como ya he mencionado en el post anterior, Spring permite inyectar métodos de dos maneras, la primera haciendo un una clase que implemente MethodReplace y la segunda es por Getter Injection.
Esta se diferencia de la primera ya que no es necesario implementar ninguna clase.
Como su nombre lo indica hace un get del ApplicationContext y devuelve ese bean, este método de inyección se usa normalmente cuando tenemos un método abstracto y no queremos hacer una clase hija que implemente el método. Para esto declaramos la siguiente clase

package com.blogspot.snakepitit.beans

public class Musician {

private String name;

public abstract Instrument getInstrument();

public void setName(String name) {
this.name = name;
}
}

package com.blogspot.snakepitit.instrumentimpl

import com.blogspot.snakepitit.interfaces

public class Guitar implements Instrument {

public void perform() {
System.out.println("Gibson Rulezzzzz");
}
}


Definimos la clase Musician la cual tiene una propiedad name y un método abstracto que devuelve Instrument que sería la interfaz que deben implementar todos los instrumentos, la cual obliga a implementar un metodo perform().
En este caso podemos usar Method Replacer pero implica escribir una nueva clase lo cual podríamos usar el tiempo en escribir la implementación de una clase hija o
hacer getter injection, para esto debemos definirlo lo siguiente en el ApplicationContext:

<bean id="slash" class="com.blogspot.snakepitit.beans.Musician">
<property name="name" value="Saul Hudson" />
<lookup-method name="getInstrument" bean="guitar" />
</bean>

<bean id="guitar" class="com.blogspot.snakepitit.instrumentimpl.Guitar" scope="prototype" />



Vemos que aparece lookup-method que sirve para decirle que la implementación de nuestro método que le indicamos en name (getInstrument) se hará de la siguiente manera :

ApplicationContext ctx = new ClassPathXmlApplicationContext("com/blogspot/snakepitit/app-context.xml");
return (Instrument) ctx.getBean("guitar");


y por otro lado vemos que tiene scope="prototype" esto se debe a que si es como un setter injection siempre se la da la misma instancia y lo que queremos es todo lo contrario, que por cada llamado devuelva una instancia nueva de la clase Guitar

martes, 27 de enero de 2009

Inyección de métodos en Spring (method injection)

Spring permite hacer inyección en las propiedades de los beans definidos dentro del Spring Context, pero que tal si quisiéramos inyectar un método ? para esto Spring también provee dos maneras de hacer la inyección de métodos o method inyection el cual vamos a poner un ejemplo de cómo funciona en ambos casos . Primero veremos el primer method llamado reemplaza miento de método o method replacement (mas adelante posteare la otra forma), Supongamos que tenemos esta clase:


package com.blogspot.snakepitit.beans

public class CajaMagicaImpl implements ICajaMagica {
private String getContenido() {
return “Este es el contenido de la caja de CajaMagicaImpl”;
}
}

En el application context deberíamos definir este bean de la siguiente manera


<bean id="cajita" class="com.blogspot.snakepitit.beans.CajaMagicaImpl">
<replaced-method name="getContenido" target="claseReemplazadora">
</bean>

<bean id="claseReemplazadora" class="com.blogspot.snakepitit.replacers.MiClaseReemplazadora">

Ya con este le decimos que el método getContenido se lo va a dar miClaseReemplazadora y no lo va a tomar desde CajaMagicaImpl, solamente nos faltaría definir miClaseReemplazadora para que quede listo, para que una clase pueda reemplazar un método debe implementar una interfaz de Spring MethodReplacer e implementar el método reimplement de la siguiente manera


package com.blogspot.snakepitit.replacers

public class MiClaseReemplazadora implements MethodReplacer {

public Object reimplement(Object target, Method method, Object[] args) {
return “Este es el contenido de la caja de MiClaseReemplazadora”;
}
}

Solamente con implementar MethodReplacer y definir el replaced-method en el bean que queremos que se inyecte el método estaría funcionando, esperen que dejen sus comentarios a ver que problemas surguieron, para la proxima voy a tratar de explicar el segundo metodo de inyeccion de metodos (getters method)