Crear alias de bean en Spring programáticamente


Existen situaciones en las que necesitamos crear alias de beans por restricciones de librerías o por componentes externos que utilizan @Qualifier junto a un @Autowired.

Un alias es un nuevo bean-name/bean-id ligado a un bean que ya existe. Por ejemplo, si en nuestro proyecto tenemos un bean javax.sql.Datasource con el id "datasource", y una librería externa tiene algo similar a:

public ExternalComponent {

	@Autowired
	@Qualifier("ds")
	private Datasource datasource;

Dicha librería necesita que un bean del tipo javax.sql.Datasource se llame "ds" y nuestro bean se llama "datasource". Lo más óptimo en este caso es crear un alias del bean original y no duplicar beans.

En configuración de Spring en XML crear un alias era muy sencillo. Simplemente teniamos que añadir el tag <alias> tal como podemos ver a continuación:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xsi:schemaLocation="http://www.springframework.org/schema/beans>

	<bean id="originalBeanName" class="..." />

	<alias name="originalBeanName" alias="aliasBeanName"/>

</beans>

Sin embargo, en configuración de Spring en Java, esto no es tan inmediato. A continuación vamos a mostrar 2 posibles situaciones.

Tenemos control sobre la instanciación del bean en una clase @Configuration

Si el bean sobre el cual queremos crear el alias está definido en una clase de configuración propia del proyecto, bastará con añadir los alias en la propia anotación @Bean en el atributo name:

@Configuration
public class MiClaseDeConfiguracion {

	@Bean(name = { "originalBeanName", "aliasBeanName1", "aliasBeanName2" })
	public HelloService defaultServiceImpl() {
		return new DefaultServiceImpl();
	}

}

De este modo, cuando Spring cree el bean, automáticamente lo creará con todos los nombres indicados en la anotación.

El objeto se instancia en una clase ajena al proyecto o mediante component-scan

Si por el contrario, no tenemos control directo sobre la instanciación del bean deberemos utilizar un mecanismo que no es muy conocido, pero que es muy fácil de implementar y 100% funcional. Se trata de usar un PostProcessor sobre la definición del contexto de Spring, concretamente usando la interfaz org.springframework.beans.factory.config.BeanFactoryPostProcessor. Para registrar nuestros alias, lo único que tendremos que hacer es definir un Bean de este tipo e implementar el método tal como hacemos en el siguiente ejemplo:

@Configuration
public class MiClaseDeConfiguracion {

	@Bean
	public BeanFactoryPostProcessor aliasPostProcessor() {
		return beanFactory -> {
			beanFactory.registerAlias("originalBeanName", "alias1");
			beanFactory.registerAlias("originalBeanName", "alias2");
		};
	}

}

Como la interfaz org.springframework.beans.factory.config.BeanFactoryPostProcessor solo tiene un método podemos usar una lambda. Pero si prefieres verlo explicitamente, el código sería el siguiente:

@Configuration
public class MiClaseDeConfiguracion {

	@Bean
	public BeanFactoryPostProcessor aliasPostProcessor() {
		return new BeanFactoryPostProcessor() {

			@Override
			public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
				beanFactory.registerAlias("originalBeanName", "alias1");
				beanFactory.registerAlias("originalBeanName", "alias2");
			}
		};
	}

}

Si tienes aun tienes dudas de como crear un alias de un bean en Spring o Spring boot, no dudes en dejar tu pregunta en los comentarios.

Avatar
Actualizado el 30 de diciembre de 2021
Comparte este artículo:
TwitterFacebookLinked In
Icon