java - 嵌套类@Configuration @Bean 创建中的spring Bean Overriding 2.1.x 失败,并显示“已经定义了具有该名称的bean”
问题描述
升级到 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
类:
我经常有演示代码,演示分布式系统行为,其中我需要多个应用程序来演示事物。由于我不想拥有多个 App 代码,我只需使用不同的配置文件启动同一个 App,并且配置文件将“不同的业务逻辑”注入到一个文件中,我想将其“保持在一起”,例如:
@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 的第二个版本。
推荐阅读
- python - 在多处理 apply_async 中维护实例状态
- python - 带有两个分组的熊猫数据框平均值:一个按月,另一个按参数
- python - 皮林特误报“
: QApplication 类型的包装 C/C++ 对象已被删除” - c++ - 如何正确地将整数的实际参数发送到 main() 以计算 C++ 中的总和?
- c# - 如何将 SQLite 表数据获取到 ArrayList
- xml - xslt 1.0 xml在2个节点之间合并
- r - 如何用两条线在 r 中绘制绘图
- phoenix-framework - Elixir:具有多个地图匹配选项的模式匹配
- mysql - 查询提取数据库中最古老的 50 首歌曲与独特艺术家的意外结果
- java - 如何将 Array (ResultSet JDBC) 转换为 List?