使 Bean 依赖于 spring boot 中的 beans 列表

Make Bean depend on list of beans in springboot

我有以下 @Configuration class,其中我声明了一个依赖于 @Autowired bean 列表的 @Bean。但是,当我访问它时,这个列表并不完整。所有 @Bean 定义都已执行,但在同一 class.

中定义的定义除外
@Configuration
public class MyConfig {

  @Autowired
  List<RequiredBean> requiredBeans;

  @Bean(name="ProblemHere")
  public CustomObject customObject() {
    log.info(requiredBeans.size()); // 1 (debugging, I can see is the one defined in "AnotherConfigClass")
  }

  @Bean(name="reqBeanInsideClass")
  public RequiredBean reqBean() {
    // this method does not get executed
    return new RequiredBean();
  }

}

有其他 class 喜欢;

@Configuration
public class AnotherConfigClass {

  @Bean(name="ThisOneGetsExecuted")
  public RequiredBean reqBean() {
    // this gets executed, and therefore, added to the list
    return new RequiredBean();
  }

}

可能最简单的解决方案是添加 @DependsOn("reqBeanInsideClass").

但是:

  1. 我想知道为什么它适用于在不同 class 中定义的所有 @Bean,但不适用于这个。
  2. 我不太确定是不是完全一样,恐怕稍后,另一个 @Bean 不会被执行
  3. 我想正确的做法应该是

    @DependsOn(List<RequiredBean>) // Obviously this does not work
    

我该如何解决?

更新

我已经将完全相同的 class 复制了两次,以查看会发生什么,所以现在我还:

@Configuration
public class MyConfig2 {

  @Autowired
  List<RequiredBean> requiredBeans;

  @Bean(name="ProblemHere2")
  public CustomObject customObject() {
    log.info(requiredBeans.size());
  }

  @Bean(name="reqBeanInsideClass2")
  public RequiredBean reqBean() {
    // this method does not get executed
    return new RequiredBean();
  }

}

令人惊讶的是,通过这样做,@Beans 方法(ProblemHereProblemHere2)在 reqBeanInsideClassreqBeanInsideClass2 方法之前被调用。

我猜出于某种原因,只要它们在另一个 class.

中定义,Springboot 就能够识别 class 所需的 @Beans
  1. 这听起来合乎逻辑吗?

是否可以不使用 @DependsOn 的数组输入而不是传递奇异值,因为它接受 String[]?这将等待在初始化之前在数组中显式声明的所有 bean,但必须手动定义。

@Configuration
public class MyConfig {

  @Autowired
  List<RequiredBean> requiredBeans;

  @Bean(name="customObject")
  @DependsOn({"reqBeanInsideClass", "thisOneGetsExecuted"})
  public CustomObject customObject() {
    log.info(requiredBeans.size());
  }

  @Bean(name="reqBeanInsideClass")
  public RequiredBean reqBean() {
    return new RequiredBean();
  }
}

@Autowired list of beans 将与同一类型的单个 bean 相同,它将包含具有该类型或通过 spring 注入具有该超类的所有 bean,问题是 bean 初始化的顺序没有得到正确控制, @DependsOn 使用数组 bean 输入应该可以解决这个问题!

你可以制作CustomObject bean @Lazy,所以只有在初始化完成后在代码中使用它才会被初始化。我认为不能在另一个非惰性 bean 中使用该 bean。只需在使用 @Autowired CustomObject 的地方调用一些逻辑,它应该在那一刻实例化 bean,其中列表将包含所有可能的 RequiredBeans

@Lazy
@Bean(name="customObject")
public CustomObject customObject() {
  log.info(requiredBeans.size());
}