Springboot启动流程
- 执行SpringApplication的静态run方法进行启动,内部其实也是调用SpringApplication的构造方法创建实例对象;
- SpringApplication构造方法内部主要做以下几件事:
- 初始化自定义ResourceLoader;
- 通过ClassUtil工具类推断webApplicationType,目前主要有三种应用类型,首先检查DispatcherHandler类是否存在,如果存在并且DispatcherServlet不存在则推断为REACTIVE类型应用,否则继续判断Servlet类和ConfigurableWebApplicationContext是否存在,如果其中一个不存在则推断为普通应用,最后默认为SERVLET类型WEB应用;
- 通过SpringFactoriesLoader扫描所有jar包classpath下META-INF/spring.factories配置,并加载配置中的所有factory配置到cache中;
- 根据SpringFactoriesLoader获取指定ApplicationContextInitializer类型配置工厂类并实例化,设置到SpringApplication实例对象中;
- 根据SpringFactoriesLoader获取指定ApplicationListener类型配置工厂类并实例化,设置到SpringApplication实例对象中;
- SpringApplication实例化完成后开始执行run方法,进入启动流程,启动之前首先通过SpringFactoriesLoader加载SpringApplicationRunListeners类型的所有实现类,并将SpringApplication实例对象通过构造方法注入,并遍历执行RunListener实现类的starting方法,通知他们,我要开始启动了;
- 准备配置环境,并执行RunListener的environmentPrepared方法,通知他们,配置环境准备好了,并将配置环境绑定到SpringApplication;
- 加载spring的默认banner;
- 根据webApplicationType类来创建对应的配置应用上下文;
- 准备上下文,主要有以下几个步骤:
- 上下文设置配置环境;
- 配置上下文的beanNameGenerator和resourceLoader等;
- 遍历执行ApplicationContextInitializer的所有实现类initialize方法,通知他们应用上下文正在进行初始化操作;
- 遍历执行SpringApplicationRunListeners的contextPrepared方法,通知他们,上下文正在准备中;
- 根据上下文修改BeanFactory的特殊配置;进行BeanFactory和启动Banner的自定义配置,主要包括BeanDefinition的覆盖策略;
- 最后在遍历执行SpringApplicationRunListeners的contextLoaded,通知他们上开始加载上下文;
- 上下文准备好之后开始执行刷新上下文操作,并注册关闭钩子函数;
- 上下文刷新之后应用上下文容器已经启动完成,开始执行SpringApplicationRunListeners的started方法,通知他们spring容器上下文已经启动完成;
- 最后通过spring容器上下文获取所有的ApplicationRunner和CommandLineRunner实现类,并执行他们的run方法。
网友评论