Spring ICO详解之总体结构
IOC介绍
IOC, spring的核心,贯穿Spring始终。直观的来说,就是由spring来负责控制对象的生命周期和对象间的关系,将对象之间的关系抽象出来,通过spring容器控制对象生成时机,减少对象之间的耦合度。
开启Spring IOC源码学习
SpringIOC 的主要依赖源码是 spring-beans 和 spring-context两个包。前面文章中曾今讲到了如何编译spring源码,接下来将maven后的工程导入eclipse里面。
一、spring IOC 中的Beanfactory
在Spring中,最基本的IOC容器接口是BeanFactory 。这个接口为具体的IOC容器的实现作了最基本的功能规定, 看如下类图,体现了Beanfactory的体系结构
其中BeanFactory作为最顶层的一个接口类,它定义了IOC容器的基本功能规范。
但是从上图中我们可以发现最终的默认实现类是 DefaultListableBeanFactory,他实现了所有的接口。
那为何要定义这么多层次的接口呢?查阅这些接口的源码和说明发现,每个接口都有他使用的场合,它主要是为了区分在 Spring 内部在操作过程中对象的传递和转化过程中,对对象的数据访问所做的限制。例如 ListableBeanFactory 接口表示这些 Bean 是可列表的,而 HierarchicalBeanFactory 表示的是这些 Bean 是有继承关系的,也就是每个Bean 有可能有父 Bean。AutowireCapableBeanFactory 接口定义 Bean 的自动装配规则。这四个接口共同定义了
Bean 的集合、Bean 之间的关系、以及 Bean 行为.
再来看看Beanfactory源码
public interface BeanFactory {
//这里是对FactoryBean的转义定义,因为如果使用bean的名字检索FactoryBean得到的对象是工厂生成的对象,
//如果需要得到工厂本身,需要转义
String FACTORY_BEAN_PREFIX = "&";
这里根据bean的名字,在IOC容器中得到bean实例,这个IOC容器就是一个大的抽象工厂。
Object getBean(String name) throws BeansException;
//这里根据bean的名字和Class类型来得到bean实例,和上面的方法不同在于它会抛出异常:如果根据名字取得的bean实例的Class类型和需要的不同的话。
Object getBean(String name, Class requiredType) throws BeansException;
//这里提供对bean的检索,看看是否在IOC容器有这个名字的bean
boolean containsBean(String name);
//这里根据bean名字得到bean实例,并同时判断这个bean是不是单件
boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
//这里对得到bean实例的Class类型
Class getType(String name) throws NoSuchBeanDefinitionException;
//这里得到bean的别名,如果根据别名检索,那么其原名也会被检索出来
String[] getAliases(String name);
}
二、Spring IOC中的Beandefinition
SpringIOC容器管理了我们定义的各种Bean对象及其相互的关系,Bean对象在Spring实现中是以BeanDefinition来描述的,其继承体系如下类图
三、spring IOC解析中BeandefinitionReader
Bean 的解析过程非常复杂,功能被分的很细,因为这里需要被扩展的地方很多,必须保证有足够的灵活性,以应对可能的变化。Bean 的解析主要就是对 Spring 配置文件的解析。这个解析过程主要通过下图中的类完成:
正如图中所说,XmlBeanDefinitionReader 和DefaultBeanDefinitionDocumentReader 有关系,是因为XmlBeanDefinitionReader中有一个DefaultBeanDefinitionDocumentReader,而不是xml跟default有继承关系
四、spring IOC中的ApplicationContext体系结构
ApplicationContext系列容器也许是我们最熟悉的,因为web项目中使用的XmlWebApplicationContext就属于这个继承体系,还有ClasspathXmlApplicationContext等,其继承体系如下图所示:
上面的四部分类图,算是spring IOC中最最核心的类图,理清了这四个类图,就基本能对整个ICO使用流程有一些大致了解,下面将分析IOC容器初始化源码
版权声明:本文为博主原创文章,未经博主允许不得转载。