加载XML文件——创建IOC容器时序图
源码理解
首先需要找到入口。IOC容器初始化运行的入口。
回顾
什么是SpringIOC
IOC(Inversion Of Control)控制反转,所谓控制反转,就是把我们代码中需要实现的对象的创建、依赖。反转给容器来实现。同时需要一种描述让容器知道需要创建的对象和对象之间的关系。即配置文件。
寻找源码入口
1.关于BeanFactory
BeanFactory:顶层接口类,定义了IOC容器的基本规范。
三个重要子类:ListableBeanFactory、HierarchicalBeanFactory 和 AutowireCapableBeanFactory
最终的默认实现类:DefaultListableBeanFactory
Spring内部在操作过程中对象的传递和转化过程中,有这各自的职能。如ListableBeanFactory接口,表示可初始化列表Bean
根据时序图来解析
如何找到入口
通过对Spring的使用以及初步的认识,我们知道Spring的初始化是从DispatcherServlet开始的,我们可以发现Spring中有许多init开头的方法,顾名思义,这些方法就是为Spring初始化做准备的。通过其继承关系,我们可以在其父类中找到最初的init()方法。
我们在HttpServletBean中可以发现有一个名为initServletBean()的方法。
注意圈红的代码,结合我们在项目中使用Spring的时候控制台打出的日志。
没有任何问题,我们找到入口了。(持续更新中,,,)
---------------------------------------------------2019-06-05---------------------------------------------------------------------------------------
入口已经找到,接下来慢慢抽丝剥茧揭开神秘的IOC容器的“面纱”
在initservletBean方法中,我们可以发现调用了initWebApplicationContext方法,我们来看这个方法
有一个方法叫作configureAndRefreshWebApplicationContext
在此方法中调用了refresh()方法,我们可以简单理解为,在Spring启动过程中会调用refresh方法。这个时候让我们在这个方法上多加点注意力。
IOC容器初始化的流程
容器启动的过程大概可以概括为三个步骤定位、加载和注册。即定位我们的配置文件,加载配置文件和根据配置文件进行注册
以ApplicationContext为例,我们可以在main中启动对xml文件的加载。以此来帮助我们去认识IOC容器。
通过对其构造方法的跟踪,我们发现调用了refresh()方法,也就是我们时序图的起点。通过setConfigLocations方法我们也可以发现,配置文件通过字符串数组的形式进行传递。这里可以作为我们学习IOC容器的起点,即,定位配置文件。
根据时序图我们可以一步一步去学习认识IOC容器的初始化过程。
2019-06-08:更为详细的IOC运行时序图