首页 > 解决方案 > sprint boot 多模块项目中相同 bean 名称的问题

问题描述

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

模块 A包含 bean-moduleService.java

模块 B包含 bean-moduleService.java

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

标签: javaspringspring-bootmulti-module

解决方案


由于您看到重复的 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 命名指令。


推荐阅读