Spring3.0核心组件的源码简单分析

来源:互联网 发布:淘宝助理怎么编辑宝贝 编辑:程序博客网 时间:2024/04/29 21:38

原文  http://computerdragon.blog.51cto.com/6235984/1243013

前言

   本文结合Spring3.0的源码进行简单的介绍,这里的核心组件不是我们常见所谓的IOC和AOP,而是以Spring3.0发布的开发包为切入点,当然Spring3.0以后的各个版本基本上差不多,思想不变,添加的主要就是对于各种特性的增强。

一 组件概述 

   Spring3.0以后的版本和以前的版本开发包组织方式不同了,官方也不将其依赖包一并包含在其中,要想使用,就必须需要下载相应的依赖包。下面就是其开发包的基本缩略图:

   还需要一个commons-logging-1.0.4.jar日志包

   Spring核心就是以Bean为中心构建的一个Bean关系网,对Bean进行解析,创建,通过Bean将其它框架整合进来,进而以Bean的方式来访问。

   诚如上图所示,用红线画出的就是Spring的核心组件,即: Core、Context、beans 。而其余特性jms、orm、aop等都是以该三个核心组件为基础实现扩展的。

   Spring带来的极大便利就是将对象之间的依赖关系转而用配置文件来实现,即依赖注入方式,IOC容器对于这些Bean进行管理

   三大核心组件的协同工作主要表现在 :Bean是包装我们应用程序自定义对象Object的,Object中存有数据,而Context就是为了这些数据存放提供一个生存环境,保存各个bean之间的对应关系,并且维护好这些对应关系。Context就是一个Bean关系的集合,也就是我们所谓的IOC容器。Core就是Context在发现、建立、维护Bean之间关系所需要的一些工具,如资源的加载,资源的抽象等。

二 Bean组件

    关于Bean组件的所有类均存在于org.springframework.beans-3.0.5.RELEASE.jar。该开发包定义了Bean的创建、Bean的解析、Bean的定义。在这里面运用了许多个设计模式,如模板方法设计模式、策略模式、工厂设计模式等。

   Bean创建:Bean的创建采用了工厂设计模式,当然这里面还有模板方法模式。

   Bean创建的顶级接口是BeanFactory, ListableBeanFactory接口表示这些Bean是可列表的,

HierarchicalBeanFactory表示的是这些Bean是有继承关系的AutowireCapableBeanFactory接口定义Bean的自动装配规则。这四个接口共同定义了Bean的集合、Bean之间的关系、以及Bean行为,而最终的默认实现类是DefaultListableBeanFactory。

    Bean的定义 ,主要是由BeanDefinition定义的,由于Spring对于对象都是转换为Bean来进行处理的,所以就需要对于IOC容器能够支持处理的Bean做一个定义,这样才能保证统一的进行操作。

     Bean的解析 ,主要就是对于Spring的配置文件进行解析处理,从中解析出相应的信息以用来生成Bean的对象。

   BeanFactory与FactoryBean的区别:

   BeanFactory 指的是IOC 容器的编程抽象,比如ApplicationContext, XmlBeanFactory 等,这些都是IOC 容器的具体表现,主要的职责是:实例化、定位、配置应用程序中的Bean对象并且建立这些Bean之间的依赖关系。

    FactoryBean 只是一个可以在IOC容器中被管理的一个bean,它是一种特殊的Bean,即一个工厂Bean,可以用来产生其他的Bean,可以把它看成是一个抽象工厂,对它的调用返回的是工厂生产的产品Bean,其返回的对象不是指定类的一个对象实例,而是该工厂Bean的getObject方法所返回的对象。

三 Context组件 

   关于Context组件的类定义都在org.springframework.context-3.0.5.RELEASE.jar中。

   Context组件就是为Bean对象提供一个运行时环境,标识一个运行时环境,初始化BeanFactory,利用BeanFactory来将解析注册的Bean进行创建,保存Bean对象之间的关系。Context可以说是将Core和Bean两个组件融合在一起了。Context组件的根级组件是ApplicationContext,既继承了BeanFactory,同时又继承了Core中的Resource类。

    Context就是构建一个BeanFactory中Bean的关系网,而都是通过AbstractApplicationContext中的refresh方法进行的。

    通过上图可以看出,ApplicationContext虽然继承了BeanFactory,可是又添加了许多新的功能,BeanFactory 不具备对资源定义的能力,而ApplicationContext可以自己完成资源定义,从这个角度上看上下文更好用一些。 ApplicationContext添加的功能主要表现在 :

    1)可以支持不同的信息源,它扩展了MessageSource。  

    2)访问资源,主要就是ResourceLoader的继承,这样可以从不同地方得到bean定义的资源。  

    3)支持应用事件,继承了ApplicationEventPublisher, 这样在上下文中引入了事件机制。

ApplicationContext 的两个子类, ConfigurableApplicationContext 表示该Context是可修改的,也就是在构建Context中用户可以动态添加或修改已有的配置信息,它下面又有多个子类,其中最经常使用的是可更新的Context,即AbstractRefreshableApplicationContext 类。

WebApplicationContext 主要用于web的Context,它可以直接访问到ServletContext。

四 Core组件

   关于Core组件的所有类都在org.springframework.core-3.0.5.RELEASE.jar。

   Core组件主要就是定义了访问资源的方式,以及对于各种资源进行用统一的接口来抽象,屏蔽了具体资源的类型。资源的顶级接口为Resource,它继承自InputStreamResource,实现了其getInstream方法,这样所有的资源就是通过该方法来获取输入流的。对于资源的加载,也实现了统一,定义了一个资源加载顶级接口ResourceLoader ,它默认的加载就是DefaultResourceLoader。

     注意这里的ApplicationContext,它继承了加载资源的接口,而它的子类AbstractApplicationContext实现了DefaultResourceLoader,而后者就是系统默认的加载资源的类。DefaultResourceLoader子类中的FileSystemResourceLoader会返回一个FileSystemResource对象,ServletContextResourceLoader会new一个ServletContextResource来返回,而AbstractApplicationContext它对于资源的访问,最终都会new一个ClassPathResource返回的。  

0 0