🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
(1)启动类 ```java @SpringBootApplication // 标注为该类为SpringBoot项目的启动类 public class ComExampleBootApplication { public static void main(String[] args) { SpringApplication.run(ComExampleBootApplication.class, args); } } ``` (2)`@SpringBootApplication`的部分源码 ```java // 将被标注的类声明为一个SpringBoot的配置类,它的底层是@Configuration, // @Configuration是Spring中定义的一个注解,被它标注的类相当于一个IoC容器或配置文件 // @Configuration的底层又是@Component来定义的,所以@Configuration到底还是一个组件 @SpringBootConfiguration // 开启自动配置,所以相比于之前学的SSM,SpringBoot少了许多的配置文件 // 我们下面看一下@EnableAutoConfiguration的源码 @EnableAutoConfiguration @ComponentScan( ... ) public @interface SpringBootApplication { ... } ``` (3)`@EnableAutoConfiguration`的部分源码 ```java // 将com/exa/sboot包及子包包含的Java类都扫描并注入到IoC容器中 @AutoConfigurationPackage // 将许多的配置组件导入到IoC容器中,并让这些组件生效 @Import({AutoConfigurationImportSelector.class}) public @interface EnableAutoConfiguration {...} ``` (4)通过`@AutoConfigurationPackage` → `Registrar.class `,找到`Registrar`的部分源码如下 ![](https://img.kancloud.cn/15/af/15afa5ab4401bdda03cdb8792895e2a1_1313x389.png) 显示结果如下,可见通过`@AutoConfigurationPackage`让SpringBoot定位到了启动类。 ![](https://img.kancloud.cn/94/0b/940b2f93805a4ced8744695e5e81e0a1_1484x410.jpg) (5)计算下面的表达式 ![](https://img.kancloud.cn/dc/c0/dcc0f0321f4a754f3cec617d3930accf_1494x703.png) ![](https://img.kancloud.cn/6b/ef/6befeaab59591f3ee01051a91e921e18_1466x491.jpg) (6)结论 所以`@AutoConfigurationPackage`最终被应用到启动类上,并扫描启动类所在的包及子包。如果你将一个包创建在启动类所在的包之上,SpringBoot是找不到的,比如启动类所在的包为`com.example.boot`,然后创建一个包为`com.example.controller`,则SpringBoot是扫描不到`controller`包的。 <br/> 我们可以通过 Debug 来查看AutoConfigurationImportSelector导入了哪些自动配置组件。 *`org.springframework.boot.autoconfigure.AutoConfigurationImportSelector`* ![](https://img.kancloud.cn/6a/9a/6a9adfd0f90ee09256bad9290ec8c264_1444x134.jpg) ![](https://img.kancloud.cn/02/22/0222d96f3ca9c0f98a6fc2925db64853_1137x336.png)