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
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) } } } } } }
Definición de Bean
<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>
Enlaces de Referencia: