【问题标题】:Inject instance of all subclasses into a list of parent classes with Spring使用 Spring 将所有子类的实例注入到父类列表中
【发布时间】:2021-11-01 10:21:03
【问题描述】:

我有一个父类:

@Component
public abstract class MyClass {
}

这个类有三个子类,MyClass2、MyClass3 和 MyClass4

@Component
public class MyClass2 extends MyClass{
}
@Component
public class MyClass3 extends MyClass{
}
@Component
public class MyClass4 extends MyClass{
}

我有另一个类,MyClassList,它有一个 MyClass 列表,我希望将其注入 MyClass 的所有子类(MyClass2、MyClass3、MyClass4)。

@Component
public class MyClassList {
    public List<MyClass> classes;

    @Autowired
    public void setMyClass(List<MyClass> classes) {
        this.classes = classes;
    }

    public void printClassListSize(){
        System.out.println(classes.size());
    }
}

当我创建一个 MyClassList 对象并调用 printClassListSize() 时,该列表始终为空。如何让类列表自动注入每个子类的实例?

【问题讨论】:

    标签: java spring dependency-injection


    【解决方案1】:

    当我创建一个 MyClassList 对象时 (...)

    这就是问题所在。你不能自己创建对象,但你应该使用 Spring 管理的对象,这样你就可以利用 Spring Dependency Injection 特性。

    您可以通过注入另一个 Spring 管理的 Bean(首选方法)来做到这一点,也可以通过编程方式自己获取:

    AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);
    MyClassList myClassList = ctx.getBean(MyClassList.class);
    

    【讨论】:

      【解决方案2】:

      替换为构造函数注入

      @Component
      public class MyClassList {
          private final List<MyClass> classes;
      
          @Autowired
          public MyClassList(List<MyClass> classes) {
              this.classes = classes;
          }
      
          public void printClassListSize(){
              System.out.println(classes.size());
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2014-04-04
        • 2019-03-03
        • 1970-01-01
        • 1970-01-01
        • 2013-06-10
        • 2020-07-05
        • 1970-01-01
        • 2021-08-28
        • 1970-01-01
        相关资源
        最近更新 更多