gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 10:09:17 26 4
gpt4 key购买 nike

我有以下 @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();
}

}

令人惊讶的是,通过这样做,两个 @Beans 方法(ProblemHereProblemHere2)都在 reqBeanInsideClass 之前被调用> 和 reqBeanInsideClass2 方法。

我猜出于某种原因,只要它们在另一个类中定义,Springboot 就能够识别一个类所需的 @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 注入(inject)包含具有该类型或具有该父类(super class)的所有 bean,问题是 bean 初始化的顺序未正确控制,@DependsOn 与array bean 输入应该可以解决这个问题!

或者

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

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

关于java - 使 Bean 依赖于 spring boot 中的 beans 列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53335191/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com