Manipular Definición de un Bean Spring

Por razones diversas he tenido que buscar una forma de modificar la definición de un Bean en Spring, de tal manera que una propiedad fuera modificada según un valor que fuera cargado desde el fichero de configuración, en este caso Config.groovy.
El código a continuación ilustra la forma de utilizar BeanFactoryPostProcessor para poder manipular la definición de un Bean durante la carga. Y MutablePropertyValues para poder manipular las propiedades de un Bean.

Código Groovy

[sourcecode language=»groovy»]
import org.springframework.beans.factory.config.BeanFactoryPostProcessor
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory
import org.springframework.beans.factory.config.BeanDefinition
import org.springframework.beans.MutablePropertyValues
import org.springframework.beans.PropertyValue
import org.springframework.beans.BeansException
import org.codehaus.groovy.grails.commons.ConfigurationHolder

//Manejo de Cadenas
import org.apache.commons.lang.StringUtils

//Logger
import org.apache.commons.logging.Log
import org.apache.commons.logging.LogFactory

/**
* Clase que implementa un Post Configurador que nos permite navegar entre todos los
* Beans y en el caso de encontrar una propiedad "@grails.configuration.alfa" cambiará
* el valor de esa propiedad por el valor de la variable a partir de la @ y en el caso
* de no existir esa variable se utilizará como valor la cadena a partir de la @.
*
* @author ubaydm
*
*/
public class GrailsConfigConfigure implements BeanFactoryPostProcessor {
protected static final Log logger = LogFactory.getLog(GrailsConfigConfigure.class)

void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)
throws BeansException {
logger.info (">> Reconfigurando Beans en la aplicación")
def beansPresentes = beanFactory.getBeanDefinitionNames()
//Ahora cargo por cada Bean por su nombre

beansPresentes.each {
def beanActual = it
logger.info (">>> Procesando el Bean $beanActual")
BeanDefinition beanCargado = (BeanDefinition)beanFactory.getBeanDefinition (beanActual)

MutablePropertyValues mutablePropertys = beanCargado.getPropertyValues()
//En caso de que el Bean no tenga propiedades no se procesa
if (mutablePropertys.size() > 0) {
//Obtención de la propiedades
PropertyValue[] propiedades = mutablePropertys.getPropertyValues()
propiedades.each { propiedad ->
def namePropiedad = propiedad.getName ()
logger.info (">>>> Procesando la propiedad $namePropiedad")
def valorActual = propiedad.getValue ()

if (valorActual.contains(‘@’)) {

def valorParaCambio = StringUtils.substringAfter (valorActual, "@")
def valorNuevo = valorConfiguracion (valorParaCambio)

logger.info (">>>>> Cambiando la propiedad $namePropiedad por $valorNuevo")
PropertyValue propiedad = mutablePropertys.getPropertyValue(namePropiedad)

PropertyValue nuevaPropiedad = new PropertyValue (address, valorNuevo)
mutablePropertys.setPropertyValueAt(nuevoAddress, 0)
}
}
}
}

}
}
[/sourcecode]

Definición de Bean

[sourcecode language=»xml»]
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:cxf="http://cxf.apache.org/core"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.0.xsd">

<bean class="GrailsConfigConfigure"/>

<jaxws:endpoint id="beanAModificarId"
implementorClass="BeanModificado"
implementor="#beanModificado"
propiedad="@propiedad.en.config">
</jaxws:endpoint>

</beans>
[/sourcecode]

Enlaces de Referencia:

Esta entrada fue publicada en Groovy. Guarda el enlace permanente.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *