I have a @Service
annotated class which provides core functionality which I can use in all my projects:
@Service
public class MyService {}
If you want to use the placeholder, another workaround is to use @Bean in a @Configuration class using @Value and the Spring applicationContext.
@Configuration
public class AppConfig {
@Autowired
private ApplicationContext context;
@Bean
public MyService myService(@Value("${myService.qualifier}") String qualifier) {
return (MyService) context.getBean(qualifier);
}
}
NB : special consideration must be taken for the placeholder bean which must be loaded at the beginning (cf javadoc)
There is an open Jira for this: https://jira.spring.io/browse/SPR-6736
The workaround is to use @Bean
in @Configuration
class:
@Configuration
public class AppConfig {
@Bean(name = { "dataSource", "subsystemA-dataSource", "subsystemB-dataSource" })
public MyService myService() {}
}
With small amount of configuration and one ImportBeanDefinitionRegistrar
you can configure bean aliases via Java configuration. You can check bean-alias library project for reference - developed for the needs of my projects. Feel free to modify and/or copy the source into your own project in case the spring version used in it does not work with your setup.
Once you have the library on your path, you declare an alias through the annotation:
@Configuration
@BeanAlias(name = "fromName", alias = "toName")
public class ExampleConfiguration {
}
That's it.
How it works is that with the annotation we import a ImportBeanDefinitionRegistrar
implementation
@Import(BeanAliasBeanRegistrar.class)
public @interface BeanAlias {
}
which registers the alias in the BeanDefinitionRegistry
class BeanAliasBeanRegistrar implements ImportBeanDefinitionRegistrar, PriorityOrdered {
@Override
public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
...
registerAlias(registry, metadata.getAnnotationAttributes(BeanAlias.class.getName()));
}
private void registerAlias(BeanDefinitionRegistry registry, Map<String, Object> attributes) {
...
registry.registerAlias(name, alias);
}
}