SpringBoot 源码 | prepareContext 方法解析
prepareContext
SpringBoot 启动流程中 SpringApplication.run 方法执行流程中的 prepareContext 方法主要是为了配置容器的基本信息,prepareContext 方法的入参包括 DefaultBootstrapContext、ConfigurableApplicationContext、ConfigurableEnvironment、SpringApplicationRunListeners、ApplicationArguments、Banner,基本上在启动流程中加载的应用程序上下文,配置的环境信息,运行监听器,应用参数及日志打印对象 Banner 都用到了,下面来看一下 prepareContext 的源码
context.setEnvironment
context.setEnvironment 方法主要是为应用程序的上下文设置 environment,可以直接参考方法源码的注释
继续向下执行看到
postProcessApplicationContext
postProcessApplicationContext 方法主要是对应用程序上下文进行相关处理,同时子类也可以根据需要进行相关处理
debug 源码可以看到这里主要是为应用程序上下文设置 ConversionService,设置完成之后
applyInitializers
applyInitializers 方法主要是在 refresh 之前将 ApplicationContextInitializer 应用于应用程序上下文 context,或者说是获取所有初始化器调用 initialize()初始化,源码如下
listeners.contextPrepared
listeners.contextPrepared 方法主要是为了触发所有 SpringApplicationRunListener 监听器的 contextPrepared 事件方法,源码
bootstrapContext.close
bootstrapContext.close 方法的官方注释意思是说当 BootstrapContext 关闭并且 ApplicationContext 准备好时这个方法会被调用
logStartupProfileInfo
logStartupProfileInfo 方法调用主要是通过日志记录活动的配置文件信息,debug 可以看到如图
配置文件内容
下面我们来看一下为什么会打印 druid,源码中 List<String> activeProfiles = quoteProfiles(context.getEnvironment().getActiveProfiles());为获取配置的环境信息中激活的 profiles 信息,跟进去可以看到
继续跟 doGetActiveProfiles 方法
继续跟 doGetActiveProfilesProperty 可以看到这里有一个常量值
常量的值就是
正是我们在配置文件 application.yml 中看到的配置参数 key 值,之后在回到主方法 prepareContext 中继续往下跟进看到 context.getBeanFactory 方法,官方注释就是 Add boot specific singleton beans 添加启动特定的单例 bean 同时执行 beanFactory.registerSingleton 方法,官方注释是
Add the given singleton object to the singleton cache of this factory.将给定的单例对象添加到此工厂的单例缓存,
beanFactory.registerSingleton
由 beanFactory.registerSingleton 方法的源码可以看到
跟进该方法看到 registerSingleton 方法主要是 addSingleton 方法,也就是我们说的将给定的单例对象添加到此工厂的单例缓存,
继续执行,当 printedBanner 不为 null 的时候执行同 springApplicationArguments 一样的操作,继续向下执行我们看到 getAllSources 方法
getAllSources
getAllSources 方法是为应用程序上下文设置所有的资源在应用程序上下文被调用时,源码如图
继续向下执行看到 load 方法
load
load 方法 Load beans into the application context 加载启动类 the context to load beans into 将启动类注入容器
加载完成之后执行 listeners.contextLoaded 触发所有 SpringApplicationRunListener 监听器 contextLoaded 方法
listeners.contextLoaded
listeners.contextLoaded 方法为运行监听器 SpringApplicationRunListener 执行 contextLoaded 方法
至此 prepareContext 就算执行完成了,对应的容器的基本配置也就加载完成了,后续继续讲解后续在 SpringBoot 启动时执行的方法。
版权声明: 本文为 InfoQ 作者【六月的雨在infoQ】的原创文章。
原文链接:【http://xie.infoq.cn/article/62f995228852989e10d13d8c1】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论