zoukankan      html  css  js  c++  java
  • Spring3.0核心组件的源码简单分析

    前言

       本文结合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返回的。  

    本文出自 “在云端的追梦” 博客,请务必保留此出处http://computerdragon.blog.51cto.com/6235984/1243013

  • 相关阅读:
    Linux Shell 下的输出重定向
    解决 Scrapy-Redis 空跑问题,链接跑完后自动关闭爬虫
    数据清洗基本概念
    前端常见的跨域请求解决方案
    Pandas模块:表计算与数据分析
    Matplotlib模块:绘图和可视化
    numpy如何使用
    Gerapy 使用详解
    MySQL常见数据库引擎及比较
    基于scrapy-redis组件的分布式爬虫
  • 原文地址:https://www.cnblogs.com/daichangya/p/12958733.html
Copyright © 2011-2022 走看看