通用参数的Singleton Bean实例
我希望通过基于单个@Component
generics类的generics参数来获得单例bean实例。
(我使用Spring 4.)
我的代码:
我有这样的interface
:
public interface Mapper { ... }
并且它的多个实现是Spring @Component
(单例)。 像这样的东西:
@Component public class MapperA implements Mapper { ... }
和
@Component public class MapperB implements Mapper { ... }
ClazzAI
, ClazzAO
, ClazzBI
和ClazzBO
是基本的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个实现: MapperA
和MapperB
即使我指定了我想要的实现作为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问题的答案