Spring被广泛应用于Java应用程序中,IOC容器以及AOP是其两大核心模块。首先,我们先学习一下IOC容器的设计思想,它提供了强大的控制反转以及依赖注入功能,让bean的构造和管理从应用中脱离出来,由Spring来管理bean的生命周期。
Bean的解析
在应用程序中,一般我们使用如下方式来从Spring的IOC容器中获取bean:
|
|
通过初始化ApplicationContext应用上下文,Spring通过读取配置文件来解析xml中的bean。下面我们首先看一下application的类继承关系,


Spring提供了很多接口来便于扩展,以ClassPathXmlApplicationContext为例,简单介绍一下bean的解析过程,入口如下:
|
|
上面代码中最重要的是refresh方法,它是整个应用上下文初始化的开始:
|
|
obtainFreshBeanFactory方法代码如下:
|
|
loadBeanDefinitions解析过程链路较长,下面给出一些主要的方法调用步骤,简单讲解下核心的过程:
AbstractXmlApplicationContext的loadBeanDefinitions方法->AbstractBeanDefinitionReader的loadBeanDefinitions方法->XmlBeanDefinitionReader的doLoadBeanDefinitions方法和registerBeanDefinitions方法->DefaultBeanDefinitionDocumentReader的doRegisterBeanDefinitions方法,
|
|
下面主要分析bean标签的解析,beans的解析嵌套,需要多次递归调用,最终也会到bean标签的解析
|
|
完成bean的解析后,得到了beanDefinition对象,这里面包含了bean的定义和属性,下面继续看bean的注册过程:BeanDefinitionReaderUtils.registerBeanDefinition
|
|
到这里,bean的解析已经完成了,这一过程主要是把构造bean->beanDefinition的对应关系,涉及到的主要类和方法如下:

Bean的初始化
完成bean的解析后,接下来将对bean进行初始化,继续跟进refresh方法,首先看一下prepareBeanFactory(factory)方法,该方法主要注册几个BeanPostProcessor:
|
|
接下来,我们来看下最重要的方法finishBeanFactoryInitialization,它会初始化所有单例、非抽象、非懒加载的bean,
|
|
接下来分析下getBean方法的过程,该方法也是我们获取bean的主要方式:
|
|
下面我们以单例bean为例了解bean的创建过程:
|
|
下面,继续看createBean如何创建bean:
|
|
populateBean方法完成bean的属性填充,在这里有依赖bean的注入过程:
|
|
最后,我们看applyPropertyValues这个方法中,它实现了bean各种属性的设置:
|
|
完成bean的属性注入后,最后对bean进行初始化,最后对initializeBean方法进行分析:
|
|
整个过程大概流程简单分析了下,具体的方法细节有待进一步研究,时序图如下:
