一、@SpringBootApplication 引导类注解,主要集成了三个注解的功能:
1、@SpringBootConfiguration 注解:表示当前类是一个配置类;
2、@ComponentScan 注解:用于对引导类所属的包及其子包下的组件进行扫描;
3、@EnableAutoConfiguration 注解:允许自动配置;
二、进入 @SpringBootApplication 源码,可以看到一个 @SpringBootConfiguration 注解:
再进入 @SpringBootConfiguration 源码,可以看到一个 @Configuration 注解,我们学习 Spring 的时候知道,被 @Configuration 注解修饰的类,就是一个配置类;
三、我们在 @SpringBootApplication 源码里还可以看到一个 @ComponentScan 注解,叫做组件扫描注解:
我们知道 SpringBoot 是基于约定的,即 SpringBoot 约定在引导类(即被 @SpringBootApplication 修饰的类)所属的包及其子包下的所有类都会被扫描;
如下所示:我们创建了 Controller,但是我们并没有配置组件扫描,SpringBoot 却可以识别到我们的 Controller;就是因为我们创建的 Controller 所属的包,位于引导类所属包的子包下;但是如果 Controller 所在的包不在引导类的包下或者子包下,那么 Controller 就不会被扫描到。
四、我们在 @SpringBootApplication 源码里还可以看到一个 @EnableAutoConfiguration 注解,这个注解的功能是允许自动配置:
进入 @EnableAutoConfiguration 可以看到一个个 @Import({AutoConfigurationImportSelector.class}) 注解,表示把外部的配置类导入到当前注解中,那么当前注解就具备了引入类的功能;
我们进入 AutoConfigurationImportSelector(自动配置导入选择器类)源码,查看当前类所属的包名:
然后我们查看 SpringBoot 项目所依赖的外部 jar 包(External Libraries):
找到当前 SpringBoot 版本对应的 具有 autoconfigure 关键字的 jar 包,可以找到上面 AutoConfigurationImportSelector 类及其所属的包:
在该 jar 包中我们还可以看到一个 META-INF 包,下面有一个 spring-configuration-metadata.json 文件,这个文件是 SpringBoot 默认的配置文件,配置一些常用的数据;
比如 tomcat 的端口号配置: