以下过程,我省略了计时器、异常上报、banner输出等过程
1、configureHeadlessProperty();配置java.awt.headless这个属性
2、得到SpringApplicationRunListener集合,然后listeners.starting();
3、构建默认参数ApplicationArguments applicationArguments = new DefaultApplicationArguments( args);
4、准备上下文需要的环境:ConfigurableEnvironment environment = prepareEnvironment(listeners, applicationArguments);
5、创建应用上下文createApplicationContext();
6、应用上下文启动前的准备阶段:prepareContext
6-1、给上下文设置environment
6-2、给上下文设置beanNameGenerator、resourceLoader
6-3、执行ApplicationContextInitializer的initialize方法
6-4、执行listeners.contextPrepared(context);
6-5、打印启动是被激活的环境的信息
6-6、注册springApplicationArguments
6-7、获取并加载所有的资源getAllSources()
6-8、执行listeners.contextLoaded(context);
7、启动上下文:refreshContext(context);(注意必须是AbstractApplicationContext的类型,启动时需要加锁)
7-1、启动前的准备,初始化startupDate、closed、active、earlyApplicationEvents的值,初始化属性资源、校验必须的属性
7-2、得到BeanFactory
7-3、准备BeanFactory:prepareBeanFactory;设置BeanClassLoader、BeanExpressionResolver,新增ResourceEditorRegistrar、ApplicationContextAwareProcessor、ApplicationListenerDetector处理器,忽略了六个Aware依赖接口,注册BeanFactory、ResourceLoader、ApplicationEventPublisher、ApplicationContext实例
7-4、postProcessBeanFactory,新增WebApplicationContextServletContextAwareProcessor处理器,忽略ServletContextAware依赖接口
7-5、invokeBeanFactoryPostProcessors
7-6、registerBeanPostProcessors
7-7、initMessageSource
7-8、initApplicationEventMulticaster,注册applicationEventMulticaster
7-9、onRefresh
7-10、registerListeners,注册ApplicationListener
7-11、finishBeanFactoryInitialization
7-12、finishRefresh
7-13、最后上下文注册了一个关闭的钩子,可以做到优雅关闭:context.registerShutdownHook();
8、启动后的一些操作afterRefresh,暂时没实现
9、调用监听器的started方法:listeners.started(context);
10、callRunners方法是执行ApplicationRunner、CommandLineRunner的实现类的方法
11、执行监听器的running方法:listeners.running(context);
后续继续优化每个细节。