我有一个@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”)。
但是:
@Bean
,但不适用于该类。@Bean
不会执行我猜正确的方法应该是
@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
和reqBeanInsideClass
这两个方法。{p1
出于某种原因,我猜想,Springboot能够识别某个类所需的reqBeanInsideClass2
,只要它们在另一个类中定义即可。
答案 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