12

我有一个带@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" />

它也在这里讨论,但我需要在没有 XML 的情况下只使用 JavaConfig。是否有可能以及如何实现?

4

3 回答 3

24

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

解决方法是@Bean@Configuration课堂上使用:

@Configuration
public class AppConfig {

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

}
于 2014-11-24T15:25:59.337 回答
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 (cf javadoc )

于 2015-03-11T13:48:07.230 回答
2

只需少量配置,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);
    }
}
于 2019-01-30T12:16:19.757 回答