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
相关产品推荐
相关产品推荐

