gpt4 book ai didi

java - 嵌套类@Configuration中的spring Bean覆盖2.1.x @Bean创建失败 'A bean with that name has already been defined'

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:22:15 25 4
gpt4 key购买 nike

升级到 spring-boot 2.1.0.M4 默认禁用 Bean 覆盖。如果您依赖覆盖,则需要将 spring.main.allow-bean-definition-overriding 设置为 true。

但为什么在内部类中定义的 Bean 也被视为重复的 bean 定义。这是一个错误吗?或者有什么解释吗?

例如:

@Configuration
public class BusinessLogicConfig {

@Configuration
class BusinessLogicSourceConfig {
@Bean
public BusinessLogic businessLogic() {
return new BusinessLogic("source");
}
}
}

适用于 spring-boot 2.0.x

但是当使用例如spring-boot 2.1.0.M4 它在启动时给我一个错误:

The bean 'businessLogic', defined in class path resource [com/example/di/bootconfigs/BusinessLogicConfig$BusinessLogicTier1Config.class], could not be registered.
A bean with that name has already been defined in URL [jar:file:/.../di/build/libs/di-0.0.1-SNAPSHOT.jar!/BOOT-INF/classes!/com/example/di/businesslogic/BusinessLogic.class]
and overriding is disabled.

Action:

Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true

由于我显然只有一个 bean 定义(仅在内部 @Configuration 类中定义),这对我来说似乎是一个错误。

如果你问我为什么要使用嵌套的内部 @Configuration 类:

我经常有演示代码,演示分布式系统行为,其中我需要多个应用程序来演示一些事情。因为我不想有多个应用程序代码,所以我只是用不同的配置文件启动同一个应用程序,并且配置文件正在注入(inject)“不同的业务逻辑”,我想将它们“放在一起”在一个文件中,例如:

@Configuration
public class BusinessLogicConfig {

@Value("${app.info.instance_index}")
private String instanceIndex;

@Profile({ "source" }) // unused fake BusinessLogic for pure sources
@Configuration
class BusinessLogicSourceConfig {
@Bean
public BusinessLogic businessLogic() {
return new BusinessLogic("source", instanceIndex);
}
}

@Profile({ "sink" }) // unused fake BusinessLogic for pure sinks
@Configuration
class BusinessLogicSinkConfig {
@Bean
public BusinessLogic businessLogic() {
return new BusinessLogic("sink", instanceIndex);
}
}

@Profile({ "tier1" })
@Configuration
class BusinessLogicTier1Config {
@Bean
public BusinessLogic businessLogic() {
return new BusinessLogic("tier1", instanceIndex);
}
}

@Profile({ "tier2" })
@Configuration
class BusinessLogicTier2Config {
@Bean
public BusinessLogic businessLogic() {
return new BusinessLogic("tier2", instanceIndex);
}
}

@Profile({ "tier3" })
@Configuration
class BusinessLogicTier3Config {
@Bean
public BusinessLogic businessLogic() {
return new BusinessLogic("tier3", instanceIndex);
}
}

}

最佳答案

事实证明它不是@Configuration 类嵌套。它是 BusinessLogic 类本身,它是一个名为 BusinessLogic 的 Bean,因为它是一个 @Component。所以上面创建了一个名为 BusinessLogic 的 Bean 的第二个版本。

关于java - 嵌套类@Configuration中的spring Bean覆盖2.1.x @Bean创建失败 'A bean with that name has already been defined',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52754979/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com