在Spring 4.1中注入泛型列表

时间:2014-09-29 15:31:00

标签: java spring list generics dependency-injection

升级Spring 3.2时遇到以下问题 - > 4.1

有一个Metadata层次结构,例如:AMetadata extends Metadata,  BMetadata extends Metadata等。

有一个Processor层次结构,例如:

abstract Processor<M extends Metadata>

AProcessor extends Processor<AMetadata>

BProcessor extends Processor<BMetadata>

有一个包含注入List个处理器的服务,如下所示:

@Inject private List<Processor<Metadata>> processors;

虽然这在Spring 3.2中完美运行,但是使用Spring 4.1.0(以及4.0)它无法注入列表成员。进入调试,发现: Processor<Metadata>.isAssignableFrom(BProcessor) == false这导致处理器bean不能作为合格的注射候选者匹配。

一种可能看起来很糟糕的解决方案是按如下方式声明处理器:

BProcessor<Metadata> extends Processor<BMetadata> - 这有效,但看起来有点奇怪。另一种选择是使用List<Processor<? extends Metadata>>,但这需要在其他地方进行一些代码更改才能编译,并且在依赖于泛型的类中会导致很多类型安全检查警告。

所以问题是,如何正确处理这个案子?有没有人遇到过类似的东西?

2 个答案:

答案 0 :(得分:1)

基于泛型的自动装配是Spring4的新功能之一。 AFAIK在以前的版本中被忽略了。更多信息:https://spring.io/blog/2013/12/03/spring-framework-4-0-and-java-generics

所以我无法想到你已经指出的任何其他解决方案:List<Processor<? extends Metadata>>

答案 1 :(得分:0)

另请参阅此处的视频Spring Framework on Java 8 https://www.youtube.com/watch?v=-_aWK8T_YMI,解释了这一点。通用类型信息一直持续到4.0 Spring发布。现在,他们正在考虑。