前言

本文结合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. Allen基因图谱:python Aabgen的安装

    1. abagen 使用教程的官方链接:abagen: A toolbox for the Allen Brain Atlas genetics data - abagen 0.1.3-doc+0.g ...

  2. C# 模拟http请求出现 由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作[windows服务器]

    系统里面用到C#模拟Http请求,上线到服务器后,发现日志中大量出现"由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作" 或"通常每个套接字地址(协议/网络地址/ ...

  3. ASP.NET Core – Globalization & Localization

    前言 之前就写过 2 篇, 只是写的很乱, 这篇作为整理版. Asp.net core (学习笔记 路由和语言 route & language) Asp.net core 学习笔记之 glo ...

  4. Asp.net core 学习笔记之 Tag Helper

    refer : https://docs.microsoft.com/en-us/aspnet/core/mvc/views/tag-helpers/authoring?view=aspnetcore ...

  5. k8s 操作命令(合集List)

    k8s 操作命令 合集List 一.K8S最常用命令如下: 1.获取pod信息:kubectl get pod 2.查看指定pod的日志信息:kubectl logs -f --tail(最后多少行) ...

  6. 微信小程序开发疑难

    1.开发者工具在小程序webview中注入wx时会提示token过期,但真机正常

  7. 在Linux 中使用 pidstat 命令监控进程性能

    一.安装 pidstat 命令 检查系统是否已经安装了 pidstat 打开终端,输入以下命令检查是否已经安装了 pidstat: pidstat -V 如果显示版本信息,说明已经安装,可以跳过安装步 ...

  8. [TK] 送礼物

    题解引用 引理1: 区间 \([l,r]\) 是最优解的必要不充分条件是: \(l,r\) 分别是区间的最小值与最大值. 这很显然,若假设不成立,当区间向内缩小时,一定有分子不变,分母变小,进而算出更 ...

  9. argmax经过sigmoid和不经过sigmoid区别

    起因 今天和同组讨论了一下网络输出时,在torch.argmax之前经过torch.sigmoid和不经过sigmoid的区别. 主要起因是实验结果图像不同 图1 不经过sigmoid 图2 经过si ...

  10. 三维医学图像深度学习,数据增强方法(monai):RandHistogramShiftD, Flipd, Rotate90d

    #coding:utf-8 import torch from monai.transforms import Compose, RandHistogramShiftD, Flipd, Rotate9 ...