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
Spring3.0核心组件的源码简单分析的更多相关文章
- FFmpeg的HEVC解码器源码简单分析:解析器(Parser)部分
===================================================== HEVC源码分析文章列表: [解码 -libavcodec HEVC 解码器] FFmpeg ...
- FFmpeg源码简单分析:libswscale的sws_scale()
===================================================== FFmpeg的库函数源码分析文章列表: [架构图] FFmpeg源码结构图 - 解码 FFm ...
- FFmpeg源码简单分析:结构体成员管理系统-AVOption
===================================================== FFmpeg的库函数源码分析文章列表: [架构图] FFmpeg源码结构图 - 解码 FFm ...
- negroni-gzip源码简单分析解读
negroni-gzip源码简单分析解读 这是一个为Negroni设计的gzip压缩处理中间件,需要用到已有的compress中的gzip,阅读了不长的源码之后,总结了一些关键要点和注意点. 检查是否 ...
- FFmpeg的HEVC解码器源码简单分析:解码器主干部分
===================================================== HEVC源码分析文章列表: [解码 -libavcodec HEVC 解码器] FFmpeg ...
- Django-session中间件源码简单分析
Django-session中间件源码简单分析 settings里有关中间件的配置 MIDDLEWARE = [ 'django.middleware.security.SecurityMiddlew ...
- FFmpeg的HEVC解码器源码简单分析:概述
===================================================== HEVC源码分析文章列表: [解码 -libavcodec HEVC 解码器] FFmpeg ...
- kafka 0.8.1 新producer 源码简单分析
1 背景 最近由于项目需要,需要使用kafka的producer.但是对于c++,kafka官方并没有很好的支持. 在kafka官网上可以找到0.8.x的客户端.可以使用的客户端有C版本客户端,此客户 ...
- urllib源码简单分析
对下面这段代码做分析 import urllib params = urllib.urlencode({'wd': 'python'}) f = urllib.urlopen("http:/ ...
- CardboardSDK-iOS 源码简单分析
该项目地址: 地址 克隆地址为 https://github.com/rsanchezsaez/CardboardSDK-iOS.git 目前如果想在iOS设备上实现双目VR的功能,Google 已经 ...
随机推荐
- JDK有用的新特性-Java Record
目录 Java Record Record使用 Instance Methods 静态方法 Static Method Record 的构造方法 step1: 紧凑和定制构造方法 Record 与 与 ...
- P7706 「Wdsr-2.7」文文的摄影布置
题意 给定长度为 \(n\) 的数组 \(a\) 和 \(b\),支持单点修改,\(q\) 次区间查询 \(\max_{l\le i<k\le r} \{a_i + a_k - \min_{i& ...
- WiFi基础(三):802.11ac/ax/be 与 WiFi4、WiFi5、WiFi6、WiFi7
liwen01 2024.09.08 前言 经过二十多年的发展,WiFi 在硬件能力.软件和算法.频谱资源.市场需求.电源与能效方面都有了很大的提升.所以我们能看到从最开始只有几 M 速率的 802. ...
- C# SAPX调用用户控件方法
//获得用户控件 Type pageType = ucMoneyList1.GetType(); //用户控件方法名 MethodI ...
- Fluent Builder 模式
前言 以前最讨厌设计复杂方法调用, 就是那种需要一堆有逻辑规则的 config 作为参数的方法. 这种 config 通常是一个大对象, 有许多 property, property 之间有存在一些逻 ...
- Tomcat——配置、部署
配置 修改启动端口号:conf/sever.xml HTTP协议默认端口号为80,若将Tomcat端口号改为80,则将来访问Tomcat时,不用输入端口号 端口号改 ...
- Web核心
JavaWeb 技术栈
- 2024 IDEA开发者部署lilishop的manager模块(详尽版)
一.环境整合 构建工具(参考工具部署方式) 软件名称 版本 相关文章推荐 Git 13.5.0 https://www.cnblogs.com/liuyangfirst/p/15996063.html ...
- [TK] Terrible Prime
题目链接 T415418 这道题严格的时间限制比较令人头疼,似乎需要一些高级的算法,但实际上是,想要用点基础知识通过这道题需要两种算法:费马小定理 (见下函数Miller_rabin) 用于subta ...
- Dos常用命令 - Dir
Dos命令,用于扫描当前目录创建目录清单 dir /s /b /ad >> "目录清单.txt" 解释: 将 dir /s /b /ad 生成的目录 追加写入目录清单. ...