SpringBoot
启动流程
SpringApplication 构造器
1.通过导入的依赖,判断项目类型
this.webApplicationType = WebApplicationType.deduceFromClasspath();
{
1.eureka servlet
2.gateway reavtive
}
2.推断主构造环境,通过方法调用栈查看main方法所在
this.mainApplicationClass = deduceMainApplicationClass();
{
StackTraceElement
}
run()方法
0.启动计时对象
stopWatch.start() ----.stop
1.获取监听器
SpringApplicationRunListeners listeners = getRunListeners(args);
try 开始
2.将main方法的参数封装成对象--命令行参数
ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);
3.通过参数构建环境
ConfigurableEnvironment environment = prepareEnvironment(listeners, applicationArguments);
4.打印banner
Banner printedBanner = printBanner(environment);
5.通过构造器判断出来的项目类型初始化上下文环境ioc容器
context = createApplicationContext();
{
初始化ioc容器context,此时只有几个开天辟地的beanDefination
没有单例对象
}
6.初始化环境,给context添加bean组件,通过创建beanFactory,填入args封装对象
prepareContext(context, environment, listeners, applicationArguments, printedBanner);
{
准备上下文环境,此时单例池中有了自动装配bean
}
7.刷新容器
refreshContext(context);
{
只找到了App类
postProcessBeanFactory
找到实现BeanFactoryPostProcessor接口的方法 比如mybatis 的相关接口,自己的含component的类以及200来个BD(后置处理器、mvc组件、自动装配的处理器)
invokeBeanFactoryPostProcessors
初始化容器
onRefresh();
将符合条件的beanDefinition创建bean
finishBeanFactoryInitialization
finishRefresh
}
8.结束计时打印启动时间
stopWatch.stop();
9.回调 表示程序准备完成
listeners.started(context);
10.
callRunners(context, applicationArguments);