spring 源码之路 -1

1.spring 的BeanFactory 是一个接口通过工厂模式 来实例化不同bean 在实例化的时候判断是否是单例的bean

2.BeanFactory 定义了Ioc 容器的基本功能规范,定义了基本的Ioc容器,有很多的实现。

(有一种只看到冰山一角的感觉)

BeanFactory 有三个子类:ListableBeanFactory、HierarchicalBeanFactory 和 AutowireCapableBeanFactory。但是从上图中我们可以发现最终的默认实现类是 DefaultListableBeanFactory,他实现了所有的接口。那为何要定义这么多层次的接口呢?查阅这些接口的源码和说明发现,每个接口都有他使用的场合,它主要是为了区分在 Spring 内部在操作过程中对象的传递和转化过程中,对对象的数据访问所做的限制。例如 ListableBeanFactory 接口表示这些 Bean 是可列表的,而 HierarchicalBeanFactory 表示的是这些 Bean 是有继承关系的,也就是每个 Bean 有可能有父 Bean。AutowireCapableBeanFactory 接口定义 Bean 的自动装配规则。

spring 的初始化分为三个过程

1.resource 定位 BeanDefinition 的资源定位,由ResourceLoader 通过统一的Resource 接口来完成。文件系统定义信息可以使用FileSystemResouce来抽象,在类路径中的可以用ClassPathResouce来使用

2.beanDefinition 的载入,这个过程是把用户定义好的Bean 表示成Ioc 容器内部的数据结构,而容器内部的数据结构就是BeanDefinition定义的数据结构。BeanDefinition 为POJO 对象的抽象 ,目的是为了方便管理。

3.向Ioc 容器注册 BeanDefinition。通过调用BeanDefinitionRegistry接口来实现。

ps: 在这个初始化的过程中,一般不包含Bean 的依赖注入,依赖注入发生在getBean时注入,但是当配置文件中 配置了lazyinit 属性时会在初始化bean 的时候就注入依赖

对于web 来说,通过contextListener –> contextLoader 来实例化Ioc 默认的的applicationContext为webApplicationContxt.在contextLoader 中先判断servletContext 中是否存在一个ioc容器,如果不存在的话,就初始化一个,调用refllush() 方法初始化。
在reflush中,加载beanDefinition,注册beanDefination,如果有lazyinit会在初始化容器时,初始化bean.
在调用getBean的时候,先初始化property 然后初始化bean ,并放入factorybean 中