You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring如何将所有子类实例注入到父类类型的List集合中

问题根因

@Autowired注解的依赖注入只对Spring IoC容器托管的Bean对象生效,如果你是直接通过new MyClassList()的方式创建对象,Spring不会对这个对象执行依赖注入逻辑,所以classes属性自然为null。

正确实现步骤

  • 第一步:给MyClassList类添加@Component(或者@Service/@Configuration等Spring托管注解),把它也交给Spring容器管理
    示例代码:
@Component
public class MyClassList {
    private List<MyClass> classes;

    // Spring 4.3+以后托管Bean的单构造器可以不用加@Autowired,推荐优先用构造器注入
    public MyClassList(List<MyClass> classes) {
        this.classes = classes;
    }

    // 若坚持用setter注入的写法,要确保类被Spring托管
    @Autowired
    public void setClasses(List<MyClass> classes) {
        this.classes = classes;
    }

    public void printClassListSize() {
        System.out.println(classes.size()); // 正常场景会输出3
    }
}
  • 第二步:不要手动new MyClassList实例,需要使用的时候从Spring容器中获取,或者通过@Autowired注入到你要用的其他托管Bean中
    示例获取方式:
// 方式1:在其他托管Bean中注入使用
@Component
public class TestService {
    @Autowired
    private MyClassList myClassList;

    public void test() {
        myClassList.printClassListSize();
    }
}

// 方式2:通过ApplicationContext上下文直接获取
ApplicationContext context = new AnnotationConfigApplicationContext("你的组件扫描包路径");
MyClassList myClassList = context.getBean(MyClassList.class);
myClassList.printClassListSize();
  • 额外注意事项:
    • 确保MyClass的三个子类都在Spring的组件扫描路径下,不然子类不会被注册成Bean,列表长度会是0而不是3
    • 抽象父类MyClass加@Component是多余的,抽象类无法被实例化,Spring不会把它注册成Bean,子类的@Component注解才生效
    • 优先使用构造器注入代替setter注入,可避免空指针风险,也符合Spring依赖注入的最佳实践

内容的提问来源于stack exchange,提问作者Nick Carfagno

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 07:09:01