使 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").
但是:
- 我想知道为什么它适用于在不同 class 中定义的所有
@Bean
,但不适用于这个。
- 我不太确定是不是完全一样,恐怕稍后,另一个
@Bean
不会被执行
我想正确的做法应该是
@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
方法(ProblemHere
和 ProblemHere2
)在 reqBeanInsideClass
和 reqBeanInsideClass2
方法之前被调用。
我猜出于某种原因,只要它们在另一个 class.
中定义,Springboot 就能够识别 class 所需的 @Beans
- 这听起来合乎逻辑吗?
是否可以不使用 @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,其中列表将包含所有可能的 RequiredBean
s
@Lazy
@Bean(name="customObject")
public CustomObject customObject() {
log.info(requiredBeans.size());
}
我有以下 @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").
但是:
- 我想知道为什么它适用于在不同 class 中定义的所有
@Bean
,但不适用于这个。 - 我不太确定是不是完全一样,恐怕稍后,另一个
@Bean
不会被执行 我想正确的做法应该是
@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
方法(ProblemHere
和 ProblemHere2
)在 reqBeanInsideClass
和 reqBeanInsideClass2
方法之前被调用。
我猜出于某种原因,只要它们在另一个 class.
中定义,Springboot 就能够识别 class 所需的@Beans
- 这听起来合乎逻辑吗?
是否可以不使用 @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,其中列表将包含所有可能的 RequiredBean
s
@Lazy
@Bean(name="customObject")
public CustomObject customObject() {
log.info(requiredBeans.size());
}