如果定义了 2 个相同的 bean,Spring Boot 也不会失败

问题描述 投票:0回答:1

最近,我使用 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
}
java spring spring-boot kotlin ioc-container
1个回答
0
投票

我猜测这种行为是因为你有第二个bean用@ConditionalProperty注释,它检查具有特定名称的bean是否已注册,如果不是它创建的,如果是它不执行任何操作,这就是spring不这样做的原因失败。您还可以检查 intelij 上是否在 dubug 和 Actuator 下查看您的活动 bean,以查看您的活动 bean。只能有一个处于活动状态。

豆类

© www.soinside.com 2019 - 2024. All rights reserved.