SpringBoot其实不仅仅给我们提供了便捷的自动配置和基于场景的Starter,也提供了我们其实并不能够“直观发现”的默认包扫描路径。
如果我们需要配置,之前是Spring应用中,我们会为项目创建基于配置的xml或者properties配置文件,但是现在,我们可以通过@Configuration注解来标注在我们的配置类上,然后以类编码的方式去实现我们需要的配置信息。这种好处也是不言而喻的,如果在项目开发过程中,对于配置文件管理不善,加之历史遗留下来的已经失效的配置文件(很多开发人员对于无用配置一般也不会进行清理,尤其第一任开发者并不是自己的前提下),就会出现一大堆“脏、乱、差”的配置文件。
而现在我们通过配置类的方式,将配置信息以类的方式去实现,彻底抛弃了之前的类与配置文件并存的情况。当然,也是需要合理的项目管理的,否则,什么样的技术手段,项目都会乱七八糟。
那我们把话题拉回来,当我们编写配置类的时候,我们发现,并没有指定我们的配置类所在的位置,那么SpringBoot就可以读取到我们的配置类。那这是怎么做到的呢?原因就是,在SpringBoot框架的源码中,已经提供了默认的包扫描路径,当然,也是支持我们通过application.yaml或者application.properties去做定制化修改(可以通过@ComponentScan或者scanBasePackages参数)。那默认的路径又是什么呢?基于这个问题,我们来去源码中寻找到答案。
我们通过SpringbootDemoApplication上唯一注解@SpringBootApplication为出发点,来探究其实现原理。
进入@SpringBootApplication的实现代码后,有一个注解引起了我们的注意。
再进入到@AutoConfigurationPackage注解中,发现引入了一个名为AutoConfigurationPackages的注册类。
里面有关于包引用的逻辑处理,我们debug来看一下。
在debug的结果中,我们发现了默认包路径。
其实,SpringBoot就是将SpringbootDemoApplication类(即:xxxApplication)所在的package及其子包都注册到IOC中。指定了默认的包加载规则。