java - sprint boot 多模块项目中相同 bean 名称的问题
问题描述
我正在为我的项目使用 Spring Boot Multi-Module。这里的问题是,我有 2 个模块 -模块 A和模块 B
模块 A包含 bean-moduleService.java
模块 B包含 bean-moduleService.java
现在在编译时出现错误,同名的 Bean 已经存在。当我使用 10 个模块并使用 IDE 运行单个模块时,无法跟踪每个模块中 bean 的名称。有什么解决办法吗?
解决方案
由于您看到重复的 bean 名称异常,我假设您至少使用 Spring Boot 2.1.0,因为 bean 覆盖现在是一个异常,除非使用spring.main.allow-bean-definition-overriding = true
.
Spring Boot 使用的默认 bean 命名策略是使用完全限定的类名来命名导入的 bean,而上下文扫描的 bean 则只使用短名称。在此处查看源代码。
假设您的 bean 是上下文扫描的,因此在短类名而不是完全限定名上发生冲突,那么您可以告诉 Spring Boot 在主类中使用完全限定命名策略。ConfigurationClassPostProcessor
只需从上面的链接中复制几行源代码:
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.context.annotation.AnnotationBeanNameGenerator;
import org.springframework.util.Assert;
public static void main(String[] args) {
new SpringApplicationBuilder(Application.class)
.beanNameGenerator(new AnnotationBeanNameGenerator() {
@Override
protected String buildDefaultBeanName(BeanDefinition definition) {
String beanClassName = definition.getBeanClassName();
Assert.state(beanClassName != null, "No bean class name set");
return beanClassName;
}
})
.run(args);
}
此策略将尊重您添加到 bean 的注释提供的任何 bean 命名指令。
推荐阅读
- uml - “类层次图”和“类图”有什么区别?
- office365 - 无法在 Mac Outlook 中使用 offiejs api 保存客户财产
- java - 读取文件以列出
- matlab - 调用函数中的 MATLAB tic/toc
- python - tf.data.Dataset 对象作为 tf.Keras 模型的输入——ValueError
- animation - 如何使用pygame在精灵后面留下痕迹?
- java - 使用 BufferedReader 读取文件时数组索引超出范围的问题
- c# - 为什么我不能使用 foreach 来填充 asp-for?
- python-3.x - python 3的高效结果显示
- javascript - 承诺 then() 和 catch() UnhandledPromiseRejectionWarnin