SpringBoot包扫描问题记录(@SpringBootApplication,@ComponentScan,@MapperScan,@Mapper)
事情起因:
上面是代码报错,大概意思是在MaterDetailImpl里面找不到bean,当然我解读完报错后就去这个类查看,事实上当时我想注入的是mapper类,结果不小心打错成了注入实体类
解决过程:
一开始我以为是Maper包没有被扫描到,我检查完我的所有Mapper类发现都是都带有@Mapper注解的,这时候我就用@MapperScan主动去扫描Mapper类,理所当然报错没有解决,因为主要问题是注入的是实体类,而不是mapper
这时候我突发奇想使用了@ComponentScan注解去扫描
@ComponentScan(value = "com.jmu.storage.mapper")
这个注解加上后竟然奇迹般没有报错了。然而@MapperScan却不能扫描到,当时我确实懵逼了,不知道为什么。当然最后我发现了我的自动注入把Mapper类写错成了实体类,改正之后不用加上面注解就可以正常运行了。
问题虽然解决了,但是为什么写错自动注入后,添加了@ComponentScan(value = “com.jmu.storage.mapper”)就不在报错了,难道扫描mapper,会自动将实体类注册成bean ???,答案显然不是。
为此我去查阅了一部分关于springboot源码相关信息发现@SpringBootApplication注解包含了一个@ComponentScan注解,问题就在这里,我们正常使用SpringBoot时候,它可以自动帮我们扫描同目录的的组件,就是依靠@SpringBootApplication注解里面的@ComponentScan注解完成的。然而我们在外部主动加入注解@ComponentScan,这个注解是会覆盖掉@SpringBootApplication注解里面的默认扫描路径的。所以这个项目启动时候只会扫描mapper包,而不会去扫描发生报错的service包
下面做个简单测试:
只扫描mapper包
项目正常启动:
当你同时对service包扫描时候:
代码再次发出相同的报错:
事件总结:使用@ComponentScan的时候必须包含整个工程中全部需要扫描的路径,默认路径失效后,将无法扫描其他包使用@ComponentScan的时候必须包含整个工程中全部需要扫描的路径,默认路径失效后,将无法扫描其他包