Java sprint引导多模块项目中存在相同bean名称的问题

Java sprint引导多模块项目中存在相同bean名称的问题,java,spring,spring-boot,multi-module,Java,Spring,Spring Boot,Multi Module,我在我的项目中使用SpringBoot多模块。 这里的问题是,我有两个模块-模块A和模块B 模块A包含bean- moduleService.java 模块B包含bean- moduleService.java 现在在编译时,我得到一个错误,即同名的Bean已经存在。当我使用10个模块并使用IDE运行单个模块时,我无法跟踪每个模块中bean的名称。有什么解决方案吗?因为您看到重复的bean名称异常,我假设您至少使用了Spring Boot 2.1.0,因为bean重写现在是一个异常,除非使用Sp

我在我的项目中使用SpringBoot多模块。 这里的问题是,我有两个模块-模块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命名指令。

很可能您不能,唯一的选择是使用@qualifier。我认为问题在于应用程序上下文中的同名bean。您可以通过名称对bean进行限定。您必须跟踪名称,否则您将遇到一个bean凌驾于另一个bean之上的问题。除非这是有意的,但您更愿意在配置中解决这个问题with@Component(“Name”)并使用@Qualifier注入它,但这是一种开销。