【问题标题】:Injecting list of generics in Spring 4.1在 Spring 4.1 中注入泛型列表
【发布时间】:2014-09-29 15:31:00
【问题描述】:

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

有一个Metadata 层次结构,例如:AMetadata extends MetadataBMetadata 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&lt;Metadata&gt;.isAssignableFrom(BProcessor) == false,这会导致处理器 bean 无法匹配为符合条件的注入候选者。

一个可能看起来像 hack 的解决方案是声明处理器如下:

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

那么问题来了,如何正确处理这种情况?有没有人遇到过类似的情况?

【问题讨论】:

    标签: java spring list generics dependency-injection


    【解决方案1】:

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

    所以我想不出除了你已经指出的任何其他解决方案:List&lt;Processor&lt;? extends Metadata&gt;&gt;

    【讨论】:

      【解决方案2】:

      另请参阅 Java 8 上的 Spring Framework https://www.youtube.com/watch?v=-_aWK8T_YMI 视频,该视频解释了这一点。通用类型信息在 4.0 Spring 版本之前被引入。现在,他们正在考虑。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多