java - 使Bean依赖于springboot中的bean列表
问题描述
我有以下@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
于不同类中定义的所有 s,但不适用于这一类。 - 我不确定那是不是完全一样,而且我担心以后,另一个
@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
和reqBeanInsideClass2
方法之前调用。
@Beans
我猜出于某种原因,只要在另一个类中定义了一个类,Springboot 就能够识别出它们是必需的。
- 这对任何人来说听起来合乎逻辑吗?
解决方案
你不能利用数组输入@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
bean 列表将与相同类型的单个 bean 相同,它将包含具有该类型或通过 springs 注入具有该超类的所有 bean,问题是 bean 初始化的顺序没有得到正确控制,@DependsOn
使用数组 bean 输入应该可以解决这个问题!
或者
您可以制作CustomObject
bean @Lazy
,因此只有在初始化完成后在代码中使用它时才会对其进行初始化。我认为不能在另一个非惰性 bean 中使用该 bean。只需调用一些@Autowired
CustomObject
使用 an 的逻辑,它应该在那一刻实例化 bean,其中列表将包含所有可能RequiredBean
的 s
@Lazy
@Bean(name="customObject")
public CustomObject customObject() {
log.info(requiredBeans.size());
}
推荐阅读
- linux - Ubuntu Docker 安装;什么是稳定的存储库?
- javascript - 显示空内容的弹出模型
- python - 是否可以在虚拟环境中启动作业并在作业在后台运行时停用虚拟环境?
- java - 当我从 mysql 迁移到 postgresql 时,login 总是读取 null
- jenkins - APM-Agent 附加到 Jenkins 应用程序返回 403 No Valid Crumb was included in request
- python - 从 Pandas 数据框中的序列中查找缺失的数字
- javascript - 如何将数组的一个元素与其他元素进行比较并在 JavaSript 中创建一个新组
- python - 为什么我在这里没有出现超出范围的错误?
- c - 如何在 Eclipse 中使用 Json-c 解析器或任何其他解析器在 Windows 中进行 C 编程
- java - 从 Cloud Firestore 上的 Document 中获取 Collections 的名称