接着昨天的调试,今天分析SpringApplication实例真正的run方法:
先看doc介绍:运行Spring应用,创建和更新一个新的ApplicationContext。
再看具体实现:
- 开启StopWatch,用于一系列任务的计时,显示总运行时间和每一个命名的任务运行时间。
- 定义ConfigurableApplicationContext变量,SpringBootExceptionReporter变量,SpringBootExceptionReporter是用于支持定制的SpringApplication启动异常报告的回调接口。
- 配置SYSTEM_PROPERTY_JAVA_AWT_HEADLESS属性。
- 开启Spring应用运行时监听器,用于run方法的监听。
- 创建ApplicationArguments实例,用于获取运行时的参数获取。
- 创建ConfigurableEnvironment实例,ConfigurableEnvironment的doc介绍:将被大部分Environment类型实现的配置接口,
提供用于设置活动的和默认配置文件以及操作底层属性源的工具,允许客户设置和验证需要的属性,定制服务转换。实例的创建调用的prepareEnvironment方法:
-
根据WebApplicationType创建相应的ConfigurableEnvironment实例。
-
从ApplicationArguments中取出args配置到ConfigurableEnvironment实例。
-
调用ConfigurableEnvironment监听了处于准备好但还未完全创建阶段的监听器的监听方法。
-
绑定ConfigurableEnvironment实例到SpringApplication。
-
如果ConfigurableEnvironment是定制过的,将其保证在一个EnvironmentConverter中,用于转换到可用的ConfigurableEnvironment。
-
将属性源连接到ConfigurableEnvironment。
-
返回创建完全的ConfigurableEnvironment实例。
-
-
ConfigurableEnvironment实例配置需要忽视的beans的信息,该beans将不被加载到Spring容器。
- 启动时控制台打印SpingBoot的Banner
- 进入createApplicationContext方法,创建createApplicationContext实例,即Spring容器:
此处主要是判断WebApplicationType类型,然后创建相应的容器。
- 初始化SpringBootExceptionReporter实例。
- 调用prepareContext方法,准备容器,查看内部实现:
- 容器设置环境。
- postProcessApplicationContext方法:注册beanNameGenerator,设置resourceLoader,设置ConversionService
- 在容器更新前应用所有的ApplicationContextInitializer。
- 调用所有监听了容器准备好阶段的监听器的监听方法,打印运行到容器准备好阶段的运行时间。l
- 添加用于引导的指定单例beans。
- 加载资源。
- 调用所有监听了容器加载资源完成阶段的监听器的监听方法。
- 进入refreshContext方法,更新容器:
先暂停,明天继续。