五、准备容器

      将启动类注入容器,后续开启自动化配置

Spring boot 2 源码分析 四 启动流程04_配置文件

5.1  context.setEnvironment(environment);   给容器context设置环境,包括各种变量

5.2  postProcessApplicationContext(context); 执行后置处理动作

Spring boot 2 源码分析 四 启动流程04_初始化_02

 这里默认不执行任何逻辑,因为beanNameGenerator和resourceLoader默认为空。之所以这样做,是springBoot留给我们的扩展处理方式,类似于这样的扩展,spring中也有很多。


5.3 调用 applyInitializers(context)  对容器进行初始化: 本质上是给ConfigurableApplicationContext下面的子context,增加对应的监听器applicationListener


5.4 listeners.contextPrepared(context); 也是一个空函数,什么也不做

Spring boot 2 源码分析 四 启动流程04_监听器_03

 5.5 给容器context注册具体的单例singleton


5.6 Set<Object> sources = getAllSources(); 获取所有启动容器所需要的配置,并且校验配置不能为空


5.7  load(context, sources.toArray(new Object[0]));  加载启动类,注入到容器

Spring boot 2 源码分析 四 启动流程04_监听器_04

Spring boot 2 源码分析 四 启动流程04_配置文件_05

按照source不同的类型,分别加载class,resource,package,charSequence,其余的类型就抛出异常不支持


最后listeners.contextLoaded(context); 监听器处理容器加载启动类,配置文件等完成的事件; 也就是容器准备完成的事件


load()方法加载, 先把bean包装成为beanDefinition,然后添加到容器的beanDefinitionMap中