SpringBoot扫描不到公共类的实体

我的项目结构是
parent

  • ademo
  • bdemo

parent是一个大项目,项目里面有web、service和entity三个子项目 ademo 依赖于bdemo里面的实体。
aProject项目的包结构是com.test.ademo
bProject项目的包结构是com.test.bdemo

以下的问题是我没有忘记标注@Component、@Service等容器注解。
在ademo项目里面使用@Autowired的时候有异常说是可能会Autowired失败,但是编译没有问题,我就直接run项目,执行结果是报空指针异常,说明对象确实自动导入失败了。经过很多查阅后发现只需要将两个项目的包名改成一样的就可以,或者使用@ComponentScan在启动类上面加入ademo和bdemo的包名即可

  1. 将ademo和bdemo的包名改成com.test.project
  2. 在ademo的启动类上面加上@ComponentScan({“com.example.ademo”,“com.example.bdemo”})
    在执行第二点的时候注意就是如果在启动类上面标注了@ComponentScan就会使会使@SpringBootApplication注解中包含的@ComponentScan注解(即默认的扫描包的位置)失效

具体原因:
因为启动类上面的@SpringBootApplication里面默认包含了一个@ComponentScan注解,这个注解默认情况下是扫描该类所属包下面的所有类,包含子目录中的类。

因为所有网上的注解都是上面那样的所以我就去想着是不是打包的时候将bdemo的项目跟ademo可结合在了一起所以拿不到com.test.ademo包下的文件,但是拿mvn打包后发现并不是。哈哈
下面是将ademo打包了的结构,
SpringBoot扫描不到公共类的实体_第1张图片
在这里插入图片描述
SpringBoot扫描不到公共类的实体_第2张图片

SpringBoot扫描不到公共类的实体_第3张图片
代码证明如果加上@ComponentScan({“com.example.ademo”,“com.example.bdemo”})是可以扫描到UserService类的,如果不加是获取不到的,应该跟SpringBoot底层加载类是相关的,大家有兴趣可以去看一下底层,在底层的我就不再这里讲了,自己去看吧。

你可能感兴趣的:(java,SpringBoot)