JavaConfig中的Spring Bean别名

时间:2014-11-24 14:29:49

标签: java spring dependency-injection spring-bean

我有一个@Service带注释的类,它提供了我可以在所有项目中使用的核心功能:

@Service
public class MyService {}

和另一个扩展它以实现项目特定的东西:

@Service
public class ExtendedMyService extends MyService {}

现在我想配置一个bean别名,以便在使用属性自动装配它时能够使用@Qualifier("MyServiceAlias")

# MyService qualifier (default: myService)
myService.qualifier=extendedMyService

在XML中看起来像:

<alias name="${myService.qualifier}" alias="MyServiceAlias" />

还讨论了here,但我只需要使用XML,JavaConfig。 是否可能以及如何实现?

3 个答案:

答案 0 :(得分:14)

有一个开放的Jira:https://jira.spring.io/browse/SPR-6736

解决方法是在@Bean类中使用@Configuration

@Configuration
public class AppConfig {

  @Bean(name = { "dataSource", "subsystemA-dataSource", "subsystemB-dataSource" })
  public MyService myService() {}

}

答案 1 :(得分:3)

如果要使用占位符,另一种解决方法是使用@Value和Spring applicationContext在@Configuration类中使用@Bean。

@Configuration
public class AppConfig {

    @Autowired
    private ApplicationContext context;

    @Bean
    public MyService myService(@Value("${myService.qualifier}") String qualifier) {
        return (MyService) context.getBean(qualifier);
    }
}

注意:必须特别考虑必须在开头加载的占位符bean(参见javadoc

答案 2 :(得分:1)

只需少量配置和一个ImportBeanDefinitionRegistrar,您就可以通过Java配置来配置bean别名。您可以查看bean-alias库项目以供参考-是为满足我的项目需要而开发的。如果其中使用的spring版本与您的设置不兼容,请随时将源代码修改和/或复制到您自己的项目中。

路径上有库之后,就可以通过注释声明别名:

@Configuration
@BeanAlias(name = "fromName", alias = "toName")
public class ExampleConfiguration {
}

就是这样。

它的工作原理是,通过注释,我们导入了ImportBeanDefinitionRegistrar实现

@Import(BeanAliasBeanRegistrar.class)
public @interface BeanAlias {
}

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);
    }
}