13.2.1 Bean组件
前面已经说明了Bean组件对Spring的重要性,下面看看Bean组件是怎么设计的。Bean组件在Spring的org.springframework.beans包下。这个包下的类主要解决了3件事:Bean的定义、Bean的创建及对Bean的解析。对Spring的使用者来说唯一需要关心的就是Bean的创建,其他两个由Spring在内部帮你完成,对你来说是透明的。
Spring Bean的创建是典型的工厂模式,它的顶级接口是BeanFactory,图13-3是这个工厂的继承层次关系。
BeanFactory有3个子类:ListableBeanFactory、HierarchicalBeanFactory和AutowireCapableBeanFactory。但是从图13-3中我们发现最终的默认实现类是DefaultListableBeanFactory,它实现了所有的接口。为何要定义这么多层次的接口呢?查阅这些接口的源码和说明可以发现每个接口都有它使用的场合,它主要是为了区分在Spring内部对象的传递和转化的过程中,对对象的数据访问所做的限制。例如,ListableBeanFactory接口表示这些Bean是可列表的,而HierarchicalBeanFactory表示这些Bean是有继承关系的,也就是每个Bean有可能有父Bean,AutowireCapableBeanFactory接口定义Bean的自动装配规则。这4个接口共同定义了Bean的集合、Bean之间的关系和Bean的行为。
Bean的定义主要由BeanDefinition描述,图13-4说明了这些类的层次关系。
Bean的定义完整地描述了在Spring的配置文件中你定义的<bean/>节点中所有的信息,包括各种子节点。当Spring成功解析你定义的一个<bean/>节点后,在Spring内部它就被转化成BeanDefination对象,以后所有的操作都是对这个对象进行的。
13.2.2 Context组件
Context在Spring的org.springframework.context包下,前面已经讲解了Context组件在Spring中的作用,它实际上就是给Spring提供一个运行时的环境,用以保存各个对象的状态。下面看一下这个环境是如何构建的。
ApplicationContext是Context的顶级父类,它除了能标识一个应用环境的基本信息外,还继承了5个接口,这5个接口主要是扩展了Context功能。图13-6是与Context相关的类结构图。
从上图可以看出,ApplicationContext继承了BeanFactory,这也说明了Spring容器中运行的主体对象是Bean。另外ApplicationContext继承了ResourceLoader接口,使得ApplicationContext可以访问到任何外部资源,这些将在Core中详细说明。
ApplicationContext的子类主要包含两个方面:
- ConfigurableApplicationContext表示该Context是可修改的,也就是在构件Context中,用户可以动态添加或修改已有的配置信息,它下面又有多个子类,其中最经常使用的是可更新的Context,即AbstractRefreshableApplicationContext类。
- WebApplicationContext顾名思义就是为Web准备的Context,它可以直接访问ServletContext,通常情况下,这个接口使用的很少。
总体来说ApplicationContext必须要完成以下几件事情。
- 标识一个应用环境
- 利用BeanFactory创建Bean对象
- 保存对象关系表。
- 能够捕获各种事件。
Context作为Spring的Ioc容器,基本上整合了Spring的大部分功能,或者说是大部分功能的基础。