通用参数的Singleton Bean实例

我希望通过基于单个@Componentgenerics类的generics参数来获得单例bean实例。

(我使用Spring 4.)

我的代码:

我有这样的interface

 public interface Mapper { ... } 

并且它的多个实现是Spring @Component (单例)。 像这样的东西:

 @Component public class MapperA implements Mapper { ... } 

 @Component public class MapperB implements Mapper { ... } 

ClazzAIClazzAOClazzBIClazzBO是基本的Java类。

我有另一个Spring @Component (singleton),它有一个Mapper class作为generics参数:

 @Component public class TransformerImpl<I, O, M extends Mapper> { /** The Mapper */ protected final M mapper; @Inject private TransformerImpl(final M mapper) { this.mapper= mapper; } ... } 

我想像这样使用它:

 @Inject private TransformerImpl transformerA; @Inject private TransformerImpl transformerB; 

问题 :

但Spring无法实例化这两个对象,因为它创建了Mapper 2个实现: MapperAMapperB即使我指定了我想要的实现作为generics参数。

知道如何制作它而不需要在@Configuration class中实例化所有这些bean吗?

你要求单身但需要两个注射点

 @Inject private TransformerImpl transformerA; @Inject private TransformerImpl transformerB; 

对于不同构造的对象。 这没有多大意义。

你现在意识到你需要两个豆子。 如果您不能(不想)在带有@Bean工厂方法的@Configuration类中执行@Bean操作,则需要声明(并扫描)两个单独的@Component类。 (我在这里公开了你的父构造函数。)

 @Component class MapperATransformerImpl extends TransformerImpl { @Inject public MapperATransformerImpl(MapperA mapper) { super(mapper); } } @Component class MapperBTransformerImpl extends TransformerImpl { @Inject public MapperBTransformerImpl(MapperB mapper) { super(mapper); } } 

处理注射目标时

 @Inject private TransformerImpl transformerA; 

Spring会找到MapperATransformerImpl ,它的类型为TransformerImpl并注入它。

尝试使用Spring 4.请参阅使用generics作为自动assembly限定符

编辑

就像@SotiriosDelimanolis在他的回答中解释的那样,Spring 4可以使用类型参数信息作为限定符来选择哪个bean定义与特定注入点匹配,但最后,它只与具体类型定义的bean定义匹配。 在您的情况下,问题是您需要为要注入的每个具体类型定义TransformerImpl bean。

作为显式定义所有bean定义的替代方法,请检查我对paramaterized类的Spring自动assembly问题的答案