spring bean冲突,springboot创建bean异常

  spring bean冲突,springboot创建bean异常

  

目录

启动豆冲突启动提示豆重复问题先说结论原理

 

  

启动bean冲突

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

 

  org。spring框架。豆子。工厂。bean定义存储异常:无法解析配置类【com。测试。API。应用程序];嵌套异常是org。spring框架。语境。注释。冲突bean定义异常: bean类【com。测试。数据中心。控制器。健康检查控制器]的批注指定的豆名称"健康检查控制器"与现有的不兼容的同名和类的豆定义【com。测试。API。控制器。健康检查控制器]冲突

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

  健康检查控制器,检查更改信息发现,不知道谁在英语字母表中第一个字母模块添加了仓库模块的依赖,造成了这一问题,删除后解决

  依赖性groupIdcom.test/groupId工件id b/工件id版本1 .0 .0-快照/版本/依赖性

  

启动提示bean重复问题

 

  

先说结论

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

 

  

原理

是因为注册feignClient的时候会注册客户端配置,参考代码如下

 

  public void registerFeignClients(AnnotationMetadata元数据,bean定义注册表注册表){//.此处省略部分代码//for(String base package : base packages){ set bean definition candidate components=scanner .findccandidatecomponents(基础包);for(bean定义candidateComponent : candidate components){ if(annotated bean定义的candidate component实例){//验证批注的类是接口//.省略部分代码//这块是把注解上的所有属性封装到地图上MapString,Object attributes=批注元数据.getAnnotationAttributes(feignclient。班级。get canonical name());//这两个重点方法请看下面代码块//获取该feignClient的名字(重点关注该方法)字符串名称=获取客户端名称(属性);//此方法就是弹簧注入豆定义的步骤(重点关注该方法)注册客户端配置(注册表、名称、属性。get(“配置”);registerFeignClient(注册表,注释元数据,属性);} } }}上面的两处重点方法, 请看此处

  //@param客户端这个地图就是通过上面的注解属性转地图得到的私有字符串getClientName(MapString,Object client){ if(client==null){ return null;} //如果从帮助文件获取到名字,那么价值有值的字符串值=(字符串)客户端。get(上下文id );//如果价值有值,那么如下3个如果条件都不会走,所以帮助文件唯一就可以做到豆不重复, //如果价值没有值,就会取值,因为多个客户的主机名都是一样的,那么就会出现重复bean if(!字符串实用程序。hastext(value)){ value=(String)client。get( value );}如果(!字符串实用程序。hastext(value)){ value=(String)client。get( name );}如果(!字符串实用程序。hastext(value)){ value=(String)client。get(服务id );} if(字符串utils。hastext(value)){返回值;}抛出新的IllegalStateException(@ feignclient。班级。get simplename())中必须提供名称或值;}私有void register客户端配置(bean定义注册表registry,对象名,对象配置){ bean定义生成器=bean定义生成器.genericbean定义(feignclientspecification。类);builder.addConstructorArgValue(名称);builder.addConstructorArgValue(配置);//在这个位置,创建beanDefinition,但是他创建的名字格式可以看出,唯一改变变量就是姓名,这个名字就是上面看到的那个方法获取的注册表。注册bean定义(名称.feignclientspecification。班级。获取simplename()、builder。getbean定义());}以上就是假装导致的跳羚重复问题的解释,仅上为个人经验,希望能给大家一个参考,也希望大家多多支持盛行它。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: