Spring核心组件有三个 Bean,Context,Core
1.Bean
Spring是面向Bean的编程,Bean是Spring的主角
Spring解决的问题便是把对象间的以来关系转而用配置文件来管理,也就是它的依赖注入机制。而这个注入关系在一个叫做IOC中的容器中进行管理,那么在IOC容器中就是被Bean包裹的对象,Spring正是通过把对象包装在Bean中从而达到管理这些对象及做一系列额外操作的目的的。
Bean组件位于Spring的org.springframework.beans包下,在这个包下的所有类主要解决3件事:1.Bean的定义,2.Bean的创建,3.Bean的解析。对Spring的使用者来说,我们唯一需要关心的就是Bean的创建,其他两个由Spring帮我们完成。
SpringBean的创建是典型的工厂模式,顶级接口是BeanFactory。BeanFactory有三个子类,1.ListableBeanFactory 2.HierachicalBeanFactory AutowireCapableBeanFactory。但是最终实现类是DefaultListableBeanFactory,它实现了所有的接口。这些接口都有自己使用的场合,主要是为了区分在Spring内部对象的传递和转化过程中,对对象的数据访问所做的限制。ListableBeanFactory 表示Bean是可列表的,HierarchicalBeanFactory表示这些Bean是可继承的,即表示每个Bean都有可能是有父类的,AutoWireCapableBeanFactory接口定义Bean的自动装配规则。这四个接口定义了Bean的集合,Bean之间的关系和行为。
Bean的定义完整地描述在Spring的配置文件中节点的所有信息,只要成功定义一个节点后,在Spring的内部它就被转换为BeanDefinition对象,以后所有的操作都是围绕着这个对象进行的。
2.Core
前面把Bean比作一场演出中的演员,Context就是这场演出的舞台背景,而Core就是演出的道具。
Core组件作为Spring的核心组件,包含了很多关键类。一个重要的组成部分就是定义了资源的访问方式,把所有资源都抽象成了一个Resource接口,对使用者屏蔽了资源类型。同理把所有的资源加载者都抽象成了一个ResourceLoader接口,又屏蔽了资源加载者的差异,默认实现是DefaultResourceLoader。
3.Context
Context在Sping的org.springframework.context包下,前面已经讲解了Context组件在Spring中的作用,它其实就是给Spring提供一个运行时环境,用以保存各个对象的状态。
ApplicationContext是Context的顶级父类,它除了能标识一个应用环境的基本信息之外,还继承了五个接口。这五个接口主要是扩展了Context的功能.ApplicationContext继承了BeanFactory和ResourceLoader接口,使得ApplicationContext可以接触到任何外部资源。ApplicationContext的子类主要包含两个方面:
(1)ConfigurableApplicationContext表示该Context是可以修改的。最常使用的是可更新的Context,即AbstractRefreshableApplicationContext类。
(2)WebApplicationContext 为Web准备的Context,它可以直接访问ServerletContext,但用得极少。
ApplicationContext需要完成下面几件事:
(1)标识一个应用环境
(2)利用BeanFactory建立Bean对象
(3)保存对象关系表
(4)能捕获各种事件
Context作为Spring的IOC容器,基本上整合了Spring的大部分功能,或者说是大部分功能的基础。
核心组件如何协同工作
Bean封装的是object,object必然有数据,如何给这些数据提供生存环境就是Context要解决的问题,对Context来说就是它要发现每个Bean之间的关系,为它建立这种关系并且维持好这种关系。Context就像是Bean关系的集合,这个集合叫做IOC容器。Core组件就是发现,建立,和维护每个Bean之间关系所需要的一系列工具,从这个角度看,把Core组件叫做Util更能让人理解。