前言

本文结合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

Spring3.0核心组件的源码简单分析的更多相关文章

  1. FFmpeg的HEVC解码器源码简单分析:解析器(Parser)部分

    ===================================================== HEVC源码分析文章列表: [解码 -libavcodec HEVC 解码器] FFmpeg ...

  2. FFmpeg源码简单分析:libswscale的sws_scale()

    ===================================================== FFmpeg的库函数源码分析文章列表: [架构图] FFmpeg源码结构图 - 解码 FFm ...

  3. FFmpeg源码简单分析:结构体成员管理系统-AVOption

    ===================================================== FFmpeg的库函数源码分析文章列表: [架构图] FFmpeg源码结构图 - 解码 FFm ...

  4. negroni-gzip源码简单分析解读

    negroni-gzip源码简单分析解读 这是一个为Negroni设计的gzip压缩处理中间件,需要用到已有的compress中的gzip,阅读了不长的源码之后,总结了一些关键要点和注意点. 检查是否 ...

  5. FFmpeg的HEVC解码器源码简单分析:解码器主干部分

    ===================================================== HEVC源码分析文章列表: [解码 -libavcodec HEVC 解码器] FFmpeg ...

  6. Django-session中间件源码简单分析

    Django-session中间件源码简单分析 settings里有关中间件的配置 MIDDLEWARE = [ 'django.middleware.security.SecurityMiddlew ...

  7. FFmpeg的HEVC解码器源码简单分析:概述

    ===================================================== HEVC源码分析文章列表: [解码 -libavcodec HEVC 解码器] FFmpeg ...

  8. kafka 0.8.1 新producer 源码简单分析

    1 背景 最近由于项目需要,需要使用kafka的producer.但是对于c++,kafka官方并没有很好的支持. 在kafka官网上可以找到0.8.x的客户端.可以使用的客户端有C版本客户端,此客户 ...

  9. urllib源码简单分析

    对下面这段代码做分析 import urllib params = urllib.urlencode({'wd': 'python'}) f = urllib.urlopen("http:/ ...

  10. CardboardSDK-iOS 源码简单分析

    该项目地址: 地址 克隆地址为 https://github.com/rsanchezsaez/CardboardSDK-iOS.git 目前如果想在iOS设备上实现双目VR的功能,Google 已经 ...

随机推荐

  1. 性能、成本与 POSIX 兼容性比较: JuiceFS vs EFS vs FSx for Lustre

    JuiceFS 是一款为云环境设计的分布式高性能文件系统.Amazon EFS 易于使用且可伸缩,适用于多种应用.Amazon FSx for Lustre 则是面向处理快速和大规模数据工作负载的高性 ...

  2. git 相关操作

        git diff 已经缓存的文件和刚刚修改过的没有缓存的文件的对比 git diff --stage   git status 查看本地文件的修改,是否进入缓存 git add 把刚刚修改过的 ...

  3. 日志与追踪的完美融合:OpenTelemetry MDC 实践指南

    前言 在前面两篇实战文章中: OpenTelemetry 实战:从零实现分布式链路追踪 OpenTelemetry 实战:从零实现应用指标监控 覆盖了可观测中的指标追踪和 metrics 监控,下面理 ...

  4. 《Vue.js 设计与实现》读书笔记 - 第7章、渲染器的设计

    第7章.渲染器的设计 7.1 渲染器与响应系统的结合 渲染器需要有跨平台的能力. 在浏览器端会渲染为真实的 DOM 元素. const { effect, ref } = VueReactivity ...

  5. constexpr声明 常量表达式

      constexpr 是 C++ 中用于声明 常量表达式 的关键字,表示一个变量或函数的值在编译时就可以确定,而不是在运行时计算. 这对优化非常有用,因为编译器可以直接将结果嵌入到程序中,减少运行时 ...

  6. 最小代价的 SSO 单点登录方案

    现在有多个 WebApp,想用最小的代价实现 SSO 单点登录.所谓最小代价,我的理解就是对原有 WebApp 的改动最小,因此 在旁路增加一个 SsoWebApp 用于管理 SSO 的账号,进行身份 ...

  7. 高通USB overview

    一,Dedicated Connectivity Ports (USB) 1,USB 3.1 Type-C with DisplayPort 2,Support USB3-DisplayPort Co ...

  8. 利用3D标签,生成RLE标签编码,并保存到csv文件

    # coding:utf-8from glob import globimport osimport SimpleITK as sitkfrom pathlib import Pathimport n ...

  9. Java日期时间API系列41-----根据毫秒值计算倒计时

    会有一个比较常见的需求,计算倒计时,比如,计算距离某时间剩余时间(27小时10分钟30秒.1天3小时10分钟30秒)或者已经进行了多长时间等.下面是2种实现代码:其中第一种超过1天会体现在小时上,比如 ...

  10. .Net 反射和特性

    学习:.net 反射简单介绍 - WebEnh - 博客园 (cnblogs.com) 反射就是通过反射程序集从而获取相关信息 十月的韩流 使用了特性就必定会使用反射 var res = obj.Ge ...