项目背景:

  某日,有需求要在三天的时间内完成两个大项目的项目合并,因为之前两个项目的包结构和类名都很多相同,于是开始考虑使用加一级包进行隔离,类似于这种结构

但是在启动的过程中,抛出来这样的异常:

Caused by: org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-specified bean name 'nameConflict' for bean class [xom.liuyun.beannameconflict.modelB.NameConflict] conflicts with existing, non-compatible bean definition of same name and class [xom.liuyun.beannameconflict.modelA.NameConflict]
at org.springframework.context.annotation.ClassPathBeanDefinitionScanner.checkCandidate(ClassPathBeanDefinitionScanner.java:348) ~[spring-context-5.0.4.RELEASE.jar:5.0.4.RELEASE]
at org.springframework.context.annotation.ClassPathBeanDefinitionScanner.doScan(ClassPathBeanDefinitionScanner.java:286) ~[spring-context-5.0.4.RELEASE.jar:5.0.4.RELEASE]
at org.springframework.context.annotation.ComponentScanAnnotationParser.parse(ComponentScanAnnotationParser.java:132) ~[spring-context-5.0.4.RELEASE.jar:5.0.4.RELEASE]
at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:284) ~[spring-context-5.0.4.RELEASE.jar:5.0.4.RELEASE]
at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:241) ~[spring-context-5.0.4.RELEASE.jar:5.0.4.RELEASE]
at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:198) ~[spring-context-5.0.4.RELEASE.jar:5.0.4.RELEASE]
at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:166) ~[spring-context-5.0.4.RELEASE.jar:5.0.4.RELEASE]
... 13 common frames omitted。

原因:

  spring提供两种beanName生成策略,基于注解的sprong-boot默认使用的是AnnotationBeanNameGenerator,它生成beanName的策略就是,取当前类名(不是全限定类名)作为beanName。由此,如果出现不同包结构下同样的类名称,肯定会出现冲突。

解决方案如下:

  1. 自己写一个类实现 org.springframework.beans.factory.support.BeanNameGeneraot接口

public class UniqueNameGenerator extends AnnotationBeanNameGenerator {

    @Override
public String generateBeanName(BeanDefinition definition, BeanDefinitionRegistry registry) {
//全限定类名
String beanName = definition.getBeanClassName();
return beanName;
}
}

 2. 在启动类上加注解@ComponentScan(nameGenerator = UniqueNameGenerator.class)使刚才我们自定义的BeanName生成策略生效。 

@SpringBootApplication
@ComponentScan(nameGenerator = UniqueNameGenerator.class)
public class BeanNameConflictApplication { public static void main(String[] args) {
SpringApplication.run(BeanNameConflictApplication.class, args);
}
}

这样,问题就可以解决了。

最新文章

  1. vs2013中2.0类库提示是英文,解决方案
  2. 根据判断PC浏览器类型和手机屏幕像素自动调用不同CSS的代码
  3. 恢复CRM plugin
  4. CentOS7安装mysql数据库
  5. jquery click & get value of attributes of a href
  6. Java 图形编程 一:入门
  7. Glibc辅助运行库 (C RunTime Library): crt0.o,crt1.o,crti.o crtn.o,crtbegin.o crtend.o
  8. GitHub初次使用记录(一)
  9. Python:模块引用
  10. [Rails Level 2] Ground up
  11. 百度系统部 在 北京市海淀区西二旗首创空间大厦 招聘 Python-交付运维系统研发工程师 - 内推网(neitui.Me)
  12. svo的一些博客解析
  13. C#中IDisposable
  14. Android实现模拟表单上传
  15. vue定义全局变量
  16. C# 远程服务器 创建、修改、删除 应用程序池 网站
  17. Java中的Future相关
  18. Solr——Windows下部署Solr7.5.0至jetty、Tomcat
  19. SqlServer中查看索引的使用情况
  20. C/C++与Java的区别

热门文章

  1. 用disabled属性修饰a标签,a标签仍然能点击
  2. ELK学习笔记(五)简单搜索和DSL查询
  3. Spring AOP: 织入的顺序
  4. Jmeter4.0----安装教程(2)
  5. 谷歌、腾讯、百度相应API批量获取地理位置坐标信息及其优缺点
  6. 用C语言实现QQ刷屏
  7. 网易云音乐APP分析
  8. Windows下编译SDL
  9. 201621123068 Week04-面向对象设计与继承
  10. mysql基础篇 - 其他基本操作