写点什么

SpringBoot 源码 | prepareContext 方法解析

  • 2022 年 9 月 08 日
    北京
  • 本文字数:1423 字

    阅读完需:约 5 分钟

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 启动时执行的方法。

发布于: 刚刚阅读数: 2
用户头像

让技术不再枯燥,让每一位技术人爱上技术 2022.07.22 加入

还未添加个人简介

评论

发布
暂无评论
SpringBoot源码 | prepareContext方法解析_springboot_六月的雨在infoQ_InfoQ写作社区