问题描述
SpringBoot项目,更改项目内容和文件结构之后启动报错
Annotation-specified bean name ‘xx’ for bean class [xxx] conflicts with existing, non-compatible bean definition of same name and class[xxx]
问题分析
正在做的工作是将之前旧的项目进行功能拆分作为微服务独立出来, 其中一个部分在更新目录结构的过程中出现了工程中不同文件夹中复制了多分旧的工程的同一个文件的类,导致这一个工程当中有重名的两个甚至多个bean, 在启动时提示以上错误
关键字:Bean重复
问题解决
既然知道了问题原因,那么解决起来也比较简单,以使用Idea为例,通过菜单栏打开使用全局搜索选项或者使用快捷键
Ctrl+Shift+F来打开
查找提示中出现问题的类名,找到使用@Service
\ @Controller
\ @repository
(要是集成了Mybatis一般就就可以忽略这个注解的)标注的重复类,此时如果不使用命名例如(@Service("xxx1Impl")
),那么Spring会在扫描时,将类名首字母小写作为key,放到一个全局Map中维护就会出现重复问题
将不需要的类删除掉,问题解决。
如果确实需要保留重复的类,那么请将bean的名称进行重命名,确认Spring容器当中bean的名称不重复。在使用@Autowired自动装配的时候以Service层为例加上:
- 使用@Primary注解在Service层上 使用该注解的实现类会被优先注入
@Service@Primarypublic class DoMyJobServiceImpltwo implements DoMyJobService{ @Override public String getJoboName() { return "横眉冷对千夫指"; }}
- 使用@Qualifier注解在Controller层与@Autowired共同使用,装配指定名称的bean
注意:使用@Qualifier注入指定Bean的时候,若没有指明Bean的名称,则其默认名称是首字母小写的类名
@RestControllerpublic class ShowFakeNewsController { //此时已经不需要在DoMyJobServiceImpltwo上写@Primary注解了 @Autowired @Qualifier("doMyJobServiceImpltwo") private VideoService videoService; @RequestMapping("/fakeNews") public String fakeNewsName(){ return videoService.getFakeNewsName(); }}