sprint引导多模块项目中具有相同bean名称的问题

时间:2019-04-25 07:25:19

标签: java spring spring-boot multi-module

我正在为我的项目使用Spring boot Multi-Module。 这里的问题是,我有2个模块-模块A 模块B

模块A 包含bean- moduleService.java

模块B 包含bean- moduleService.java

现在在编译时我收到以下错误消息:同名Bean已存在。当我使用10个模块并使用IDE运行单个模块时,无法跟踪每个模块中bean的名称。有什么解决办法吗?

1 个答案:

答案 0 :(得分:0)

由于您看到重复的bean名称异常,因此我假设您至少使用Spring Boot 2.1.0,因为除非使用spring.main.allow-bean-definition-overriding = true明确启用,否则bean覆盖现在是一个异常。

Spring Boot使用的默认bean命名策略是使用完全限定的类名来命名导入的bean,而使用上下文扫描的bean仅使用短名来命名。 See source here

假设您的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命名指令。