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
<?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.