最近,我使用 Spring Boot 处理标准任务,并遇到了意外行为。 我有带有 @Bean 注释的注释配置,如果存在特定属性,我需要注册两个 bean 之一。另外,我需要将创建的 bean 注入到指定 bean 名称下的其他 bean 中。我尝试这样做:
@Bean("bean-1")
//Specific conditional on property
fun s1() = "1"
@Bean("bean-1")
//Specific conditional on property
fun s2() = "2"
@Bean
fun result(
@Qualifier("bean-1") b: String
): Any? {
return null
}
但是我得到了一个意想不到的结果。那行得通。 Spring 不会失败,但是我定义了 2 个具有相同类型甚至相同名称的 bean。 Spring忽略了这个冲突。我进一步添加了一些条件,如下所示:
@Bean("bean-1")
@ConditionalOnMissingBean(name = ["bean-1"])
fun s1() = "1"
@Bean("bean-1")
@ConditionalOnProperty(name = ["some_property"], matchIfMissing = true)
fun s2() = "2"
@Bean
fun result(
@Qualifier("bean-1") b: String
): Any? {
return null
}
这也可以,但是 Spring 会忽略在方法 s2 中创建 bean! 请帮忙这是 Spring Boot 的预期行为吗? 我使用 Spring Boot 3.3.5。
复制示例:
@Bean("bean-1")
@ConditionalOnMissingBean(name = ["bean-1"])
fun s1() = "1"
@Bean("bean-1")
@ConditionalOnProperty(name = ["some_property"], matchIfMissing = true)
fun s2() = "2"
@Bean
fun result(
@Qualifier("bean-1") b: String
): Any? {
return null
}
我猜测这种行为是因为你有第二个bean用@ConditionalProperty注释,它检查具有特定名称的bean是否已注册,如果不是它创建的,如果是它不执行任何操作,这就是spring不这样做的原因失败。您还可以检查 intelij 上是否在 dubug 和 Actuator 下查看您的活动 bean,以查看您的活动 bean。只能有一个处于活动状态。