domingo, octubre 16, 2005

Spring XBean

Un interesante proyecto que apareció últimamente en la web (via Spring-Loaded) es XBean.
Este proyecto nos permite "modificar" las etiquetas XML del fichero de configuración de Spring para poder escribir:

<configuracion url="http://www.myurl.com"
xmlns="http://example.com/schemas/config">
<myDao><dao/></myDao>
<roles>
<rol key="admin"/>
<rol key="user"/>
</roles>
<configuracion>

en lugar de:

<bean id="configuracion" class="mypackage.Configuracion">
<property name="url" value="http://www.myurl.com"/>
<property name="dao" ref="dao"/>
<property name="roles">
<list>
<value>
<bean class="mypackage.Rol">
<property key="admin"/>
</bean>
</value>
<value>
<bean class="mypackage.Rol">
<property key="user"/>
</bean>
</value>
</list>
</property>
</bean>
<bean id="dao" class="mypackage.ConfiguracionDAO"/>

Aunque parezca que estamos "desnaturalizando" la definición del xml de configuración de Spring, en muchos casos esto es mas que útil. Por ejemplo, cuando queremos que el usuario final tenga acceso a configurar parte de la aplicación. Es mucho mas sencillo en ese caso que se aprendan una sintaxis "especial", que la sintaxis Spring. Además de mantener el tamaño de los ficheros en algo mas razonable.

Para poder hacer esta "magia", debemos agregar los jars de XBean al proyecto, generar un fichero en el classpath con los alias y utilizar ClassPathXmlApplicationContext (o sus similares) del package org.xbean.spring.context en lugar de los normales de Spring.

El fichero de alias deberá estar bajo "META-INF/services/org/xbean/spring/", y llamarse igual que la url que hayamos elegido para el XML namespace. En este ejemplo el path completo sería META-INF/services/org/xbean/spring/http/example.com/schemas/config, y el fichero config debería contener:

configuracion=mypackage.Configuracion
configuracion.myDao=dao
dao=mypackage.ConfiguracionDAO
rol=mypackage.Rol

e incluso podríamos ahorrarnos algunos alias si nuestras propiedades se llaman igual que nuestras etiquetas y agregamos

mypackage=package

en el fichero.