千家信息网

如何解决springboot-启动bean冲突问题

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,小编给大家分享一下如何解决springboot-启动bean冲突问题,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!启动bean冲突在一次启动中遇到了bean冲突的问题,提示存在两个名
千家信息网最后更新 2026年11月03日如何解决springboot-启动bean冲突问题

小编给大家分享一下如何解决springboot-启动bean冲突问题,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!

启动bean冲突

在一次启动中遇到了bean冲突的问题,提示存在两个名称重复的bean

org.springframework.beans.factory.BeanDefinitionStoreException: Failed to parse configuration class [com.test.api.Application]; nested exception is org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-specified bean name 'healthCheckController' for bean class [com.test.datahub.controller.HealthCheckController] conflicts with existing, non-compatible bean definition of same name and class [com.test.api.controller.HealthCheckController]

项目中包括多个模块,其中A、B两个模块都有同一个类:

HealthCheckController,检查更改信息发现,不知道谁在A模块添加了B模块的依赖,造成了这一问题,删除后解决

                    com.test            B            1.0.0-SNAPSHOT        

启动提示bean重复问题

先说结论

只需要在@FeignClient注解的contextId属性上加上独一的标示,即可解决问题

原理

是因为注册feignClient的时候会注册ClientConfiguration,参考代码如下

public void registerFeignClients(AnnotationMetadata metadata,      BeanDefinitionRegistry registry) {   //...此处省略部分代码   //   for (String basePackage : basePackages) {      Set candidateComponents = scanner            .findCandidateComponents(basePackage);      for (BeanDefinition candidateComponent : candidateComponents) {         if (candidateComponent instanceof AnnotatedBeanDefinition) {            // verify annotated class is an interface            //...省略部分代码             //这块是把注解上的所有属性封装到map上            Map attributes = annotationMetadata            .getAnnotationAttributes(            FeignClient.class.getCanonicalName());             //这两个重点方法请看下面代码块             //获取该feignClient的名字(重点关注该方法)            String name = getClientName(attributes);             //此方法就是spring注入beanDefination的步骤(重点关注该方法)            registerClientConfiguration(registry, name,                  attributes.get("configuration"));             registerFeignClient(registry, annotationMetadata, attributes);         }      }   }}

上面的两处重点方法, 请看此处

//@param client 这个map就是通过上面的注解属性转map得到的private String getClientName(Map client) {   if (client == null) {      return null;   }   //如果从contextId获取到名字,那么value有值的   String value = (String) client.get("contextId");   //如果value有值,那么如下3个if条件都不会走,所以contextId唯一就可以做到bean不重复,   //如果value没有值,就会取value,因为多个client的serverName都是一样的,那么就会出现重复bean   if (!StringUtils.hasText(value)) {      value = (String) client.get("value");   }   if (!StringUtils.hasText(value)) {      value = (String) client.get("name");   }   if (!StringUtils.hasText(value)) {      value = (String) client.get("serviceId");   }   if (StringUtils.hasText(value)) {      return value;   }    throw new IllegalStateException("Either 'name' or 'value' must be provided in @"         + FeignClient.class.getSimpleName());} private void registerClientConfiguration(BeanDefinitionRegistry registry, Object name,      Object configuration) {   BeanDefinitionBuilder builder = BeanDefinitionBuilder         .genericBeanDefinition(FeignClientSpecification.class);   builder.addConstructorArgValue(name);   builder.addConstructorArgValue(configuration);   //在这个位置,创建beanDefinition,但是他创建的名字格式可以看出,唯一改变变量就是name,这个name就是上面看到的那个方法获取的   registry.registerBeanDefinition(         name + "." + FeignClientSpecification.class.getSimpleName(),         builder.getBeanDefinition());}

看完了这篇文章,相信你对"如何解决springboot-启动bean冲突问题"有了一定的了解,如果想了解更多相关知识,欢迎关注行业资讯频道,感谢各位的阅读!

问题 方法 冲突 代码 就是 模块 重点 两个 名字 属性 注解 多个 篇文章 请看 部分 面的 提示 位置 信息 原理 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 中关村互联网科技集团 中资互联网科技 互联网科技集团 礼当家互联网科技 丰台科技园 互联网 滨湖区互联网智能科技产品供应 哈尔滨秒房互联网科技有限公司 深圳市运趣互联网科技有限公司 科技互联网的估值 华服互联网科技官网 来此购互联网科技有限公司 浙南科技城互联网大厦建设工程 用友工业互联网科技发展 保险科技服务互联网营销体系 广州千川互联网科技有限公司 工业互联网科技创业 信承诺互联网科技有限公司 全球科技与互联网公司市值变化 互联网高科技行业有哪些企业 互联网科技创业有什么好项目 互联网科技海报 互联网科技的英文 科技与互联网的利与弊 崇明区互联网教育科技诚信经营 互联网科技革命什么开始 产业互联网科技服务公司 互联网科技资金流入 江苏互联网智能科技软件 第三届互联网大会安防黑科技 互联网企业和网络科技有限公司
0