使Bean依赖于springboot中的Bean列表

时间:2018-11-16 09:45:44

标签: java spring spring-boot spring-config

我有一个@Configuration类,其中声明一个依赖于@Autowired bean列表的@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,但不适用于该类。
  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();
  }

}

令人惊讶的是,这样做,在@BeansProblemHere方法之前都同时调用了ProblemHere2reqBeanInsideClass这两个方法。{p1

出于某种原因,我猜想,Springboot能够识别某个类所需的reqBeanInsideClass2,只要它们在另一个类中定义即可。

  1. 这对任何人都合理吗?

1 个答案:

答案 0 :(得分:1)

由于数组输入接受String[],因此您不能将数组输入用于.forEach(...)而不是传递奇异值吗?那将等待所有在数组中显式声明的bean,然后再初始化,尽管必须手动定义。

@DependsOn

@Autowired list of beans将与相同类型的单个Bean相同,它将通过弹簧注入包含该类型或具有该超类的所有Bean,问题是无法正确控制Bean初始化的顺序,{{ 1}}使用数组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(); } } bean @Lazy,因此只有在初始化完成后在代码中使用它时,才会对其进行初始化。我认为该豆不能在另一个非懒豆中使用。只需在使用@DependsOn CustomObject的地方调用一些逻辑,它就应该在该时刻实例化bean,该列表将包含所有可能的@Autowired s

CustomObject