martes, julio 04, 2006

Procesadores post-instanciación en Spring 2.0

Debasish Ghosh nos enseña aquí un nuevo "feature" de Spring 2.0: la habilidad de realizar inyección de dependencias a beans que *no* han sido instanciados por Spring. Un buen ejemplo son los beans que genera Hibernate (o cualquier ORM) mediande *new*.

Esto se consigue con la anotación "@Configurable" o con "AnnotationBeanConfigurerAspect" para los que no desean utilizar anotaciones y el xml de beans de siempre:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans">

<aop:spring-configured/>

<bean id="myDao"
class="package.ChildrensDaoImpl"/>

<bean id="myClass" class="package.MyClass" lazy-init="true">
<property name="dao" ref="myDao" />
</bean>
</beans>

@Configurable("myClass")
public class MyClass {
private Dao dao;
public String getChildrens(...) {
List childrens = dao.find(...);
}
public void setDao(Dao dao) {
this.dao = dao;
}
}
Con esta configuración y un poco de *magia* AOP, logramos inyectar *service objects* en nuestros *domain objects*.

2 comentarios:

spirit1988 dijo...

Hola Niko :D! Perdoná mi ignorancia, tengo un problema y creo que podría encaminarme por este lado; verás, tengo varios archivos XML de configuración cuyo número es dinámico, y Spring hasta a hora los carga todos bien. El tema es que hay un bean al que debo setear propiedades en una lista, cuyas propiedades están esparcidas en varios de los archivos o "módulos" de la aplicación.

(La idea de la aplicación es que, justamente, uno pueda dejar caer un .jar en el classpath y esta la autodetecte como un módulo mas)

¿Hay alguna forma de darle propiedades a un bean desde varios xml? Ya lo se, sería setear propiedades DESPUÉS de la instanciación, pero si Spring puede hacerlo sería mucho mejor que alguna que otra solución sucia que ya se me está ocurriendo.

Desde ya gracias por cualquier ayuda, un saludo! (muy bueno el artículo)

Niko dijo...

Puedes implemetar un "BeanFactoryPostProcessor" y en el método "postProcessBeanFactory", acceder a las propiedades de los beans y modificarlos.
Luego, la clase que implementes la puedes definir en los xml de configuración tantas veces como quieras (una por cada módulo).
Así lo tengo hecho para alguna aplicación en la que se van agregando elementos a una lista dependiendo si están configurados los módulos o no.
Si quieres mas detalles o ejemplos en código, escríbeme a la dirección que hay en mi profile. Aunque en realidad debería postear sobre el tema ;)