升级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>>
,但这需要在其他地方进行一些代码更改才能编译,并且在依赖于泛型的类中会导致很多类型安全检查警告。
所以问题是,如何正确处理这个案子?有没有人遇到过类似的东西?
答案 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发布。现在,他们正在考虑。