JavaConfig中的Spring Bean别名

13

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

@Service
public class MyService {}

还有一个扩展它以实现项目特定内容的:

@Service
public class ExtendedMyService extends MyService {}

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

现在我想要配置一个Bean的别名,这样在使用属性进行自动装配时就可以使用@Qualifier("MyServiceAlias")

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

在 XML 中它看起来像这样:

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

这个问题在这里也有讨论,但我需要使用无需XML的JavaConfig来实现。 可能吗?如果可能,如何实现?

3个回答

24

这个问题已经在Jira上公开记录:https://jira.spring.io/browse/SPR-6736

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

@Configuration
public class AppConfig {

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

}

这对我来说是不可能的,因为我想将限定符存储在属性文件中。 - dtrunk

4
如果你想使用占位符,另一种解决方法是在一个@Configuration类中使用@Value和Spring applicationContext来使用@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
通过少量的配置和一个ImportBeanDefinitionRegistrar,您可以通过Java配置配置bean别名。您可以查看bean-alias库项目进行参考-为我的项目需求而开发。如果其中使用的spring版本与您的设置不兼容,请随意修改和/或复制源代码到您自己的项目中。
一旦您将该库添加到路径中,您可以通过注释声明别名:
@Configuration
@BeanAlias(name = "fromName", alias = "toName")
public class ExampleConfiguration {
}

"最初的回答" 翻译成中文是 "Original Answer"。
这段话的意思是,通过注解导入一个实现了 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);
    }
}

我能够使用标准的JavaConfig实现BeanFactoryPostProcessor来完成这个任务。请查看我的答案:https://dev59.com/SLLma4cB1Zd3GeqPXDWz#61685677 - Scott Carlson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接