若依新建子模块的@ComponentScan坑

故事背景:想要在若依的基础上新建自己的业务模块来进行开发,但又不想包名叫做ruoyi,于是就有了今天刻苦的教训!

首先创建了子模块,并按照官方的文档来进行了引入

但是报错提示service bean找不到

各种修改 RuoYiApplication 的扫描注解,分别产生不多的报错:
1、找不到 Mapper;
2、找到多个 Mapper(接口 和 Impl,取消 @service 注解会报其他错);
3、无法判断 jdbc url

以为是由子模块没有引入导致的

但是查看maven的引入是有引入子模块的

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

于是尝试了很多原因都提示报错 service没有引入

这是一个很常见的bean没有引入的一个问题,于是我又重头捋了一遍,发现自己流程上没有问题,引入子模块也没问题,于是我不断的翻找查阅终于在若依的issues上找到了答案:

https://gitee.com/y_project/RuoYi/issues/I121LM

终于问题得到了解决

于是罪魁祸首落到了 @ComponentScan 和@SpringBootApplication上

于是又恶补了一番基础知识和源码。

发现自己基础知识多么的薄弱,都是走马观花,知道个大概就好了,唉 留下了不学无术的眼泪。

下面进入正题

我们都知道这个注解@ComponentScan 是扫包 ,但是SpringBootApplication启动时会默认扫描主类当前包及子包 。 今天的坑就在这里!!!

spring 默认会自动发现被 @Component、@Repository、@Service 和 @Controller 标注的类,并注册进容器中。

如果@SpringBootApplication和@ComponentScan注解共存,那么@SpringBootApplication注解的扫描的作用将会失效

那么将会出现以下三种状况:

(1)只有@SpringBootApplication

@SpringBootApplication默认会扫描同包及子包,所以TestController被扫描,打印日志

(2)存在@SpringBootApplication和一个@ComponentScan注解

@ComponentScan注解会先被处理,然后返回,使得@SpringBootApplication中的配置没有生效

(3)存在@SpringBootApplication和多个@ComponentScan注解

多个@ComponentScan注解会被整合成一个@ComponentScans注解,不影响@SpringBootApplication中配置的正确读取

解决方法:

使用@ComponentScans注解,而不是直接使用@ComponentScan注解

这是最完美方案,既不会影响SpringBoot本身的配置,你也可以随意自定义自己的配置

写的不好,还请各位大佬多多指教!

Logo

快速构建 Web 应用程序

更多推荐