在阅读源码的过程中,发现对SpringBoot下,JavaBean加载过程有些模糊。这篇文章,也是对自己在开发道路上的学习与记录。
=======================================
这里贴一下Spring启动过程
第一步:获取并启动监听器
第二步:构造容器环境
第三步:创建容器(SpringBoot一般是AnnotationConfigServletWebServerApplicationContext)
第四步:实例化SpringBootExceptionReporter.class,用来支持报告关于启动的错误
第五步:准备容器
第六步:刷新容器
第七步:刷新容器后的扩展接口
=====================================
IOC初始化过程发生在准备容器,刷新容器阶段。
AnnotationConfigServletWebServerApplicationContext:Spring容器上下文对象,保存各种信息。
DefaultListableBeanFactory():负责实例化Bean,工厂模式。它实现了BeanDefinitionRegistry接口, 具备了注册Bean的能力。
介绍一下beanDefinitionMap的数据结构:
private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256);
BeanDefinition接口定义(感性认识一下)
第一部分大致分三个过程(JavaBean相关):
1.加载Spring内部定义的Bean到(Context的BeanFactory下的)beanDefinitionMap中;
2.加载SpringApplication启动类(main方法实现位置)到 beanDefinitionMap中;
3.执行refreshContext,扫描指定目录下包含@Compent和@Compent子类的类到beanDefinitionMap中;
下面给出两张流程图(第一、二部分在图1,第三部分在图2)
========================================================================================
Spring内部自定义的Bean
小结: SpringIOC初始化过程的第一部分,AnnotationConfigServletWebServerApplicationContext将所有信息通过DefaultListableBeanFactory注册到beanDefinitionMap。Spring下一步就是Bean的创建和初始化。