SpringBoot包扫描问题记录(@SpringBootApplication,@ComponentScan,@MapperScan,@Mapper)

SpringBoot包扫描问题记录(@SpringBootApplication,@ComponentScan,@MapperScan,@Mapper)

事情起因:

SpringBoot包扫描问题记录(@SpringBootApplication,@ComponentScan,@MapperScan,@Mapper)_第1张图片

上面是代码报错,大概意思是在MaterDetailImpl里面找不到bean,当然我解读完报错后就去这个类查看,事实上当时我想注入的是mapper类,结果不小心打错成了注入实体类

SpringBoot包扫描问题记录(@SpringBootApplication,@ComponentScan,@MapperScan,@Mapper)_第2张图片

解决过程:

一开始我以为是Maper包没有被扫描到,我检查完我的所有Mapper类发现都是都带有@Mapper注解的,这时候我就用@MapperScan主动去扫描Mapper类,理所当然报错没有解决,因为主要问题是注入的是实体类,而不是mapper

这时候我突发奇想使用了@ComponentScan注解去扫描

@ComponentScan(value = "com.jmu.storage.mapper")

这个注解加上后竟然奇迹般没有报错了。然而@MapperScan却不能扫描到,当时我确实懵逼了,不知道为什么。当然最后我发现了我的自动注入把Mapper类写错成了实体类,改正之后不用加上面注解就可以正常运行了。

问题虽然解决了,但是为什么写错自动注入后,添加了@ComponentScan(value = “com.jmu.storage.mapper”)就不在报错了,难道扫描mapper,会自动将实体类注册成bean ???,答案显然不是。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5shnAe69-1686410683191)(C:\Users\fems\AppData\Roaming\Typora\typora-user-images\image-20230610231127617.png)]

为此我去查阅了一部分关于springboot源码相关信息发现@SpringBootApplication注解包含了一个@ComponentScan注解,问题就在这里,我们正常使用SpringBoot时候,它可以自动帮我们扫描同目录的的组件,就是依靠@SpringBootApplication注解里面的@ComponentScan注解完成的。然而我们在外部主动加入注解@ComponentScan,这个注解是会覆盖掉@SpringBootApplication注解里面的默认扫描路径的。所以这个项目启动时候只会扫描mapper包,而不会去扫描发生报错的service包

下面做个简单测试:

只扫描mapper包

SpringBoot包扫描问题记录(@SpringBootApplication,@ComponentScan,@MapperScan,@Mapper)_第3张图片

项目正常启动:

SpringBoot包扫描问题记录(@SpringBootApplication,@ComponentScan,@MapperScan,@Mapper)_第4张图片

当你同时对service包扫描时候:

SpringBoot包扫描问题记录(@SpringBootApplication,@ComponentScan,@MapperScan,@Mapper)_第5张图片

代码再次发出相同的报错:

SpringBoot包扫描问题记录(@SpringBootApplication,@ComponentScan,@MapperScan,@Mapper)_第6张图片

事件总结:使用@ComponentScan的时候必须包含整个工程中全部需要扫描的路径,默认路径失效后,将无法扫描其他包使用@ComponentScan的时候必须包含整个工程中全部需要扫描的路径,默认路径失效后,将无法扫描其他包

你可能感兴趣的:(spring,boot,java,mybatis)