Spring IoC容器与应用上下文的设计与实现
SpringBoot启动流程源码分析:
SpringBoot启动流程分析(一):SpringApplication类初始化过程
SpringBoot启动流程分析(二):SpringApplication的run方法
SpringBoot启动流程分析(三):SpringApplication的run方法之prepareContext()方法
SpringBoot启动流程分析(四):IoC容器的初始化过程
SpringBoot启动流程分析(五):SpringBoot自动装配原理实现
SpringBoot启动流程分析(六):IoC容器依赖注入
笔者注释版Spring Framework与SpringBoot源码git传送门:请不要吝啬小星星
spring-framework-5.0.8.RELEASE
SpringBoot-2.0.4.RELEASE
第四步:刷新应用上下文前的准备阶段
一、prepareContext()方法前面我们介绍了SpringBoot 启动流程run()方法的前三步,本章,我们将用一个章节介绍:第四步:刷新应用上下文前的准备阶段。也就是prepareContext()方法。
首先看prepareContext()方法。
1 private void prepareContext(ConfigurableApplicationContext context, 2 ConfigurableEnvironment environment, SpringApplicationRunListeners listeners, 3 ApplicationArguments applicationArguments, Banner printedBanner) { 4 //设置容器环境 5 context.setEnvironment(environment); 6 //执行容器后置处理 7 postProcessApplicationContext(context); 8 //执行容器中的 ApplicationContextInitializer 包括spring.factories和通过三种方式自定义的 9 applyInitializers(context); 10 //向各个监听器发送容器已经准备好的事件 11 listeners.contextPrepared(context); 12 if (this.logStartupInfo) { 13 logStartupInfo(context.getParent() == null); 14 logStartupProfileInfo(context); 15 } 16 17 // Add boot specific singleton beans 18 //将main函数中的args参数封装成单例Bean,注册进容器 19 context.getBeanFactory().registerSingleton("springApplicationArguments", 20 applicationArguments); 21 //将 printedBanner 也封装成单例,注册进容器 22 if (printedBanner != null) { 23 context.getBeanFactory().registerSingleton("springBootBanner", printedBanner); 24 } 25 26 // Load the sources 27 Set<Object> sources = getAllSources(); 28 Assert.notEmpty(sources, "Sources must not be empty"); 29 //加载我们的启动类,将启动类注入容器 30 load(context, sources.toArray(new Object[0])); 31 //发布容器已加载事件 32 listeners.contextLoaded(context); 33 }