首页 > 解决方案 > 使Bean依赖于springboot中的bean列表

问题描述

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

@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();
  }

}

有其他课程,例如;

@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. 我想知道为什么它适用@Bean于不同类中定义的所有 s,但不适用于这一类。
  2. 我不确定那是不是完全一样,而且我担心以后,另一个@Bean不会被处决
  3. 我想正确的方法应该是这样的

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

我应该如何解决这个问题?

更新

为了看看会发生什么,我复制了完全相同的课程两次,所以现在我也有:

@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方法(ProblemHere& ProblemHere2)都在reqBeanInsideClassreqBeanInsideClass2方法之前调用。

@Beans我猜出于某种原因,只要在另一个类中定义了一个类,Springboot 就能够识别出它们是必需的。

  1. 这对任何人来说听起来合乎逻辑吗?

标签: javaspringspring-bootspring-config

解决方案


你不能利用数组输入@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();
  }
}

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

或者

您可以制作CustomObjectbean @Lazy,因此只有在初始化完成后在代码中使用它时才会对其进行初始化。我认为不能在另一个非惰性 bean 中使用该 bean。只需调用一些@Autowired CustomObject使用 an 的逻辑,它应该在那一刻实例化 bean,其中列表将包含所有可能RequiredBean的 s

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

推荐阅读