来解读下springboot启动过程的源码,了解所有的实现与启动顺序。
这段代码都懂,就这么两行代码,就把我们的整个项目启动完成了。
那么到底是什么原理呢?来探究下
启动总纲
练功得先有武功秘籍总纲,所以我们先来说下启动的整个流程机制,然后才来挖掘源码细节。
我们的springboot也是依赖了spring,所以也是有spring的启动过程的,当我们启动项目时,spring容器就会初始化,过程如下:
- 在spring启动过程中有invokeBeanFactoryPostProcessors方法,里面会去解析spring的配置类,在解析lite类型的配置类时,会解析以下注解
- 此时就会通过\@ComponentScan来扫描我们项目配置的bean
- 然后再解析\@Import注解,如果是实现了DeferredImportSelector接口的Import,则先存起来,等所有的配置类都解析完成了再解析该类型的。可以查看源码org.springframework.context.annotation.ConfigurationClassParser#processImports
- springboot的@SpringBootApplication注解里面就是有个@Import(AutoConfigurationImportSelector.class)类,该类就是实现了DeferredImportSelector接口,所以springboot自定义的配置类的优先级都是低于我们自己配置的
- AutoConfigurationImportSelector类就会去加载spring.factories配置文件里面的配置
- 优先级:这些AutoConfiguration配置类里面都是有\@Conditional注解的,满足该自动配置类的条件才会去加载该类(比如我们pom文件引入了依赖才会去加载),配置类里还会有各种@Bean,这些都是要解析的,但是会去判断是否已经加载了该bean(即我们程序员定义的),没有加载才会去加载
- 然后会去过滤一些自动配置类,因为不是所有spring.factories文件里的配置类都会去加载,会有一些排除措施
- 执行run方法,启动springboot容器相关信息
- 配置类加载完了,就会去加载最上面流程中的onRefresh(),这个方法springboot重写了,springboot重写的这个方法会去启动tomcat服务器
- 最后发布一些springboot启动完成的事件
整个springboot启动加载过程就是这样了,下边会讲述一些启动源码,但是不涉及spring启动的源码。
new SpringApplication对象
我们java都是从main方法开始的,所以我们也从这里开始: