五、准备容器
将启动类注入容器,后续开启自动化配置
5.1 context.setEnvironment(environment); 给容器context设置环境,包括各种变量
5.2 postProcessApplicationContext(context); 执行后置处理动作
这里默认不执行任何逻辑,因为beanNameGenerator和resourceLoader默认为空。之所以这样做,是springBoot留给我们的扩展处理方式,类似于这样的扩展,spring中也有很多。
5.3 调用 applyInitializers(context) 对容器进行初始化: 本质上是给ConfigurableApplicationContext下面的子context,增加对应的监听器applicationListener
5.4 listeners.contextPrepared(context); 也是一个空函数,什么也不做
5.5 给容器context注册具体的单例singleton
5.6 Set<Object> sources = getAllSources(); 获取所有启动容器所需要的配置,并且校验配置不能为空
5.7 load(context, sources.toArray(new Object[0])); 加载启动类,注入到容器
按照source不同的类型,分别加载class,resource,package,charSequence,其余的类型就抛出异常不支持
最后listeners.contextLoaded(context); 监听器处理容器加载启动类,配置文件等完成的事件; 也就是容器准备完成的事件
load()方法加载, 先把bean包装成为beanDefinition,然后添加到容器的beanDefinitionMap中