SpringBoot的启动入口就是一个非常简单的run方法,这个run方法会加载一个应用所需要的所有资源和配置,最后启动应用。
通过查看run方法的源码,我们发现,run方法首先启动了一个监听器,然后创建了一个应用上下文ConfigurableApplicationContext,我们知道,context就是用来加载各种bean和环境配置等信息。
在context的初始化过程中,会调用一个load方法,将我们的启动类当做参数(sources)传进去,这个方法的主要作用就是加载应用所需的各种bean和资源配置。
load方法会创建一个BeanDefinitionLoader,由BeanDefinitionLoader的loader方法来执行具体的加载。
BeanDefinitionLoader的load方法根据所传入的不同source类型来选择不同的加载方式,前面说到,这整个过程之中,source里面就只有启动类这一个对象,所以这里就将其强转成Class并加载。
加载Class的方法里面调用了一个isComponent(Class> type)方法,这个方法便是用来判断加载的类上有没有注解的,如果有,就要开始解析注解了。
如此一来,启动类上的@SpringBootApplication注解就会被调用,这个注解是实现SpringBoot自动配置功能的关键所在。
查看@SpringBootApplication的源码,我们发现它实际上是@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan三个注解的合集。其中@EnableAutoConfiguration是启用自动配置的,并将导入一些自动配置的类定义;@ComponentScan用来加载应用中一些自定义的类。
@EnableAutoConfiguration最终会导入一个自动配置的类列表,这些类大多数都处于备用状态。这边是SpringBoot自动配置的秘密,它已经把你可能要用到的东西全都准备好了,一旦你引入了相关的jar包,对应的功能就会被启用,应用启动时,程序就会读取相关的配置信息。程序首先会尝试到配置文件中读取相关的配置信息,如果配置文件中没有,那么就会启用配置的默认值。