启动流程
Spring IoC 启动流程与循环依赖处理

-
容器启动时,会通过某种途径加载
ConfigurationMetaData 。除了代码方式比较直接外,在大部分情况下,容器需要依赖某些工具类,比如:BeanDefinitionReader,BeanDefinitionReader 会对加载的ConfigurationMetaData 进行解析和分析,并将分析后的信息组装为相应的BeanDefinition ,最后把这些保存了bean 定义的BeanDefinition ,注册到相应的BeanDefinitionRegistry ,这样容器的启动工作就完成了。这个阶段主要完成一些准备性工作,更侧重于bean 对象管理信息的收集,当然一些验证性或者辅助性的工作也在这一阶段完成。 -
经过第一阶段,所有
bean 定义都通过BeanDefinition 的方式注册到BeanDefinitionRegistry 中,当某个请求通过容器的getBean 方法请求某个对象,或者因为依赖关系容器需要隐式的调用getBean 时,就会触发第二阶段的活动:容器会首先检查所请求的对象之前是否已经实例化完成。如果没有,则会根据注册的BeanDefinition 所提供的信息实例化被请求对象,并为其注入依赖。当该对象装配完毕后,容器会立即将其返回给请求方法使用。
Spring Boot
private void initialize(Object[] sources) {
if (sources != null && sources.length > 0) {
this.sources.addAll(Arrays.asList(sources));
}
// 判断是否是 Web 项目
this.webEnvironment = deduceWebEnvironment();
setInitializers((Collection) getSpringFactoriesInstances(ApplicationContextInitializer.class));
setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));
// 找到入口类
this.mainApplicationClass = deduceMainApplicationClass();
}
初始化流程中最重要的就是通过