首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >JavaConfig中的Spring Bean别名

JavaConfig中的Spring Bean别名
EN

Stack Overflow用户
提问于 2014-11-24 22:29:49
回答 3查看 19.3K关注 0票数 11

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

代码语言:javascript
运行
复制
@Service
public class MyService {}

另一个是扩展它来实现特定于项目的东西:

代码语言:javascript
运行
复制
@Service
public class ExtendedMyService extends MyService {}

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

代码语言:javascript
运行
复制
# MyService qualifier (default: myService)
myService.qualifier=extendedMyService

在XML中,它将如下所示:

代码语言:javascript
运行
复制
<alias name="${myService.qualifier}" alias="MyServiceAlias" />

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

EN

回答 3

Stack Overflow用户

发布于 2014-11-24 23:25:59

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

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

代码语言:javascript
运行
复制
@Configuration
public class AppConfig {

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

}
票数 23
EN

Stack Overflow用户

发布于 2015-03-11 21:48:07

如果你想使用占位符,另一个变通方法是在@Configuration类中使用@Bean,使用@Value和Spring。

代码语言:javascript
运行
复制
@Configuration
public class AppConfig {

    @Autowired
    private ApplicationContext context;

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

注意:必须特别注意占位符bean,它必须在开头加载(参见javadoc)

票数 3
EN

Stack Overflow用户

发布于 2019-01-30 20:16:20

只需少量配置和一个ImportBeanDefinitionRegistrar,您就可以通过Java configuration配置bean别名。您可以查看bean-alias库项目作为参考-为我的项目的需要而开发。随时修改和/或将源代码复制到您自己的项目中,以防其中使用的spring版本不适用于您的设置。

将库放在路径中后,通过注释声明一个别名:

代码语言:javascript
运行
复制
@Configuration
@BeanAlias(name = "fromName", alias = "toName")
public class ExampleConfiguration {
}

就这样。

它的工作原理是使用注释导入一个ImportBeanDefinitionRegistrar实现

代码语言:javascript
运行
复制
@Import(BeanAliasBeanRegistrar.class)
public @interface BeanAlias {
}

它在BeanDefinitionRegistry中注册别名

代码语言:javascript
运行
复制
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);
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27107133

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档