版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。
(本文基于 Spring 的5.1.6.RELEASE 版本)
Spring的启动流程可以归纳为三个步骤:
1、初始化Spring容器,注册内置的BeanPostProcessor的BeanDefinition到容器中2、将配置类的BeanDefinition注册到容器中3、调用refresh()方法刷新容器
因为是基于 java-config 技术分析源码,所以这里的入口是 AnnotationConfigApplicationContext ,如果是使用 xml 分析,那么入口即为 ClassPathXmlApplicationContext ,它们俩的共同特征便是都继承了 AbstractApplicationContext 类,而大名鼎鼎的 refresh()便是在这个类中定义的。我们接着分析 AnnotationConfigApplicationContext 类,源码如下:
// 初始化容器 public AnnotationConfigApplicationContext(Class... annotatedClasses) { // 注册 Spring 内置后置处理器的 BeanDefinition 到容器 this(); // 注册配置类 BeanDefinition 到容器 register(annotatedClasses); // 加载或者刷新容器中的Bean refresh(); }
所以整个Spring容器的启动流程可以绘制成如下流程图:
接着我们主要从这三个入口详细分析一下Spring的启动流程:
一、初始化流程:
1、spring容器的初始化时,通过this()调用了无参构造函数,主要做了以下三个事情:
(1)实例化BeanFactory【DefaultListableBeanFactory】工厂,用于生成Bean对象(2)实例化BeanDefinitionReader注解配置读取器,用于对特定注解(如@Service、@Repository)的类进行读取转化成 BeanDefinition 对象,(BeanDefinition 是Spring 中极其重要的一个概念,它存储