【问题标题】:Autowiring list of components in spring 4Spring 4 中的组件自动装配列表
【发布时间】:2025-12-14 23:10:03
【问题描述】:

我正在尝试以这种方式自动装配接口列表:

@Autowired
private List<SomeInterface<SomeAbstractClass>> list;

这是我的接口和抽象类:

public interface SomeInterface<T extends SomeAbstractClass> 

public abstract class SomeAbstractClass implements Serializable 

这些是我的组件(它们应该在列表中结束):

@Component("componentA")
public class ImplementationA implements SomeAbstractClass<ClassAImpementingSomeAbstractClass> 

@Component("componentB")
public class ImplementationB implements SomeAbstractClass<ClassBImpementingSomeAbstractClass> 

抽象类的实现是这样定义的:

 public class ClassAImpementingSomeAbstractClass extends SomeAbstractClass
 public class ClassBImpementingSomeAbstractClass extends SomeAbstractClass

从 spring 3.2.5 迁移到 4.3.11 后出现问题。 在春季 3 中,我得到了具有 ImplementationA 和 ImplementationB 的列表。 移至 spring 4 后,我在部署期间遇到异常:

org.springframework.beans.factory.NoSuchBeanDefinitionException: 否 类型的限定 bean 'java.util.List>' 可用:预期 至少 1 个符合自动装配候选资格的 bean。依赖 注释: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

问题是为什么 spring 试图找到 typ List 的 bean?它不应该尝试查找 SomeInterface 类型的所有 bean 并将它们添加到列表中(完全是我在 spring 3 上得到的)?

感谢您的任何建议!

【问题讨论】:

    标签: spring list autowired


    【解决方案1】:

    Spring 在 4.0 中用泛型和 bean 定义改变了很多东西,以允许泛型成为 bean 等的限定符。

    https://spring.io/blog/2013/12/03/spring-framework-4-0-and-java-generics

    虽然我不能 100% 确定为什么这不再有效,但我认为它现在需要您稍微更具体一些,以便 Spring 正确评估这些限定符。 (或类似的东西)

    无论哪种方式,您都应该能够通过这样做来修复它:

    @Autowired
    private List<SomeInterface<? extends SomeAbstractClass>> list;
    

    【讨论】:

      最近更新 更多