spring源码学习——spring整体架构和设计理念
Spring是在Rod Johnson的《Expert One-On-One J2EE Development and Design 》的基础上衍生而来的。主要目的是通过使用基本的javabean来完成以前只能用EJB完成的事情降低企业应用的复杂性。这一系列源码学习是基于Spring-4.3.11版本的。
一.Spring的整体架构

如图所示,spring可以被总结为一下几个部分:
(1)Core Container
为Spring的核心容器,包含Beans,Core,Context和SpEL模块。
Core和Beans模块是框架的基础部分,提供(IoC)控制反转和依赖注入特性。其中,Bean在Spring中的作用就像Object对OOP的意义一样,没有对象的概念就没有面向对象的编程,在Spring中没有Bean也就没有Spring存在的意义。Spring可以让对象自建的依赖关系转而用配置文件来管理,即Spring的依赖注入机制。而这个注入关系在一个叫IoC的容器中管理,即Context。为了更好的理解Bean,Core,Context三者的关系。可以把Bean理解为一场演出中的演员,Context就是这场演出的背景,而Core就是演出的道具,用来发现、建立和维护每个Bean之间的关系所需要的一系列工具。从这个角度看,把Core组件称为Util更容易让人理解。
Spring-Expression模块提供了一个强大的表达式语言用于在运行时查询和操作对象。他是JSP2.1规范中定义的unifed expression language的一个扩展。该语言支持设置、获取属性的值,属性的分配,方法的调用,访问数组上下文(accessing the context of arrays),容器和索引器,逻辑和算数运算符,命名变量以及Spring的IoC容器中根据名称检索对象。他也支持list投影、选择和一般的list聚合。
(2) AOP and Instrumentation
Aop提供了一个符合AOP联盟标准的面向切面编程的实现,他可以让你定义例如方法拦截器和切点,从而将逻辑代码分开,降低他们之间的耦合性。利用source-level的元数据功能,还可以将各种行为的信息合并到你的代码中,类似于.NET技术中的attibute概念。
Apsects模块提供了对AspectJ的集成支持。
Instrumentation模块提供了class instrumentation支持和classloader实现,使得可以在特定的应用服务器上使用。
(3) Messaging
Spring framework 4框架包含了一个Spring-message模块,这个模块中含有来自Spring集成项目中的例如消息、MessageChannel、MessageHandler和其他关键的抽象,为基于消息的应用提供了基础。该模块还包括一组用于将消息映射到方法的注释,类似于Spring基于MVC注释的编程模型。
(4)Data Access/Integration
Data Access/Integration 层包含有JDBC、ORM、OXM、JMS和Transaction模块。
a.JDBC模块提供了一个JDBC抽象层,它可以消除冗长的JDBC编码和解析书库厂商特有的错误代码。这个模块包含了Spring对JDBC数据访问进行封装的所有类。
b.Spring-TX(Transaction)模块支持编程和声明性的事务管理,这些事务类必须实现特定的接口,并且对所有的POJO都使用。
c.ORM模块为流行的对象-关系映射API,如JPA,JDO,Hibernate等,提供了一个交互层。利用ORM封装包,可以混合使用所有Spring提供的特性进行O/R映射。如前面提到的简单
声明性事务管理。
d.OXM模块提供了一个对Object/XML映射的实现的抽象层,Object/XML映射实现包括JAXB、Castor、XMLBeans、JiBX和Xstream.
e.JMS模块主要包含了一些制造和消费消息的特性。
(5)Web
Web层包含了spring-web, spring-webmvc, spring-websocket和spring-webmvc-portlet 模块。
web模块:提供了基础的面向Web的集成特性,例如:多文件上传,使用servlet listeners初始化IoC容器以及一个面向Web的应用上下文。它还包含了一个http客户端和Spring远程支持中Web的相关部分。
webmvc模块:也称为Web Servlet模块,包含Spring的模型视图控制器(MVC)和其他Web服务实现的Web应用程序。Spring的MVC框架在域模型代码和Web表单之间提供了一种干净的分离,并集成了Spring框架的所有其他特性。
(6)Test
Test模块支持使用Junit和TestNG对Spring组件进行测试。它提供了一致的Spring 应用上下文和缓存加载。它还提供了可以用来隔离测试代码的模拟对象。
二.Spring设计理念
其实,Spring就是面向Bean的编程(Bean Oriented Programming,BOP),Bean在Spring中才是真正的主角。Bean在Spring中的作用就像Object对于OOP的意义一样,没有对象的概念就没有面向对象编程,在Spring中就没有Spring存在的意义。就像一次演出,舞台都准备好了但是没有演员一样。为什么要Bean这种角色或者Bean在Spring中如此重要,这个由Spring框架的设计目标决定的。Spring为何如此流行?我们用Spring的原因是什么?你会发现原来Spring解决了一个非常关键的问题,它可以让你把对象之间的依赖关系转而用配置文件来管理,也就是说它的依赖注入机制。而这个注入关系在一个叫做IoC的容器中管理,那么在IoC容器又是什么?就是被Bean包裹的对象。Spring正是通过把对象包裹在Bean中从而达到管理这些对象以及做一系列额外操作的目的的。
它的这种设计策略完全类似于Java实现OOP的设计理念,当然Java本身的设计要比Spring复杂的太多太多,但是他们都是构建一个数据结构,然后根据这个数据机构设计它的生存环境,并让它在这个环境中按照一定的规律不停地云顶,在他们的不停运动中设计一个系列与环境或者与其他个体完成信息交换。这样想来我们用到的其他架构大概都是类似的设计理念。
spring源码学习——spring整体架构和设计理念的更多相关文章
- Mybatis源码学习之整体架构(一)
简述 关于ORM的定义,我们引用了一下百度百科给出的定义,总体来说ORM就是提供给开发人员API,方便操作关系型数据库的,封装了对数据库操作的过程,同时提供对象与数据之间的映射功能,解放了开发人员对访 ...
- spring源码解析1--spring整体架构
一.Spring整体架构图 关于Spring的基本介绍就不再赘述了,先展示Spring框架的整体架构图如下示: 二.Spring结构介绍 Spring主要分为Core Container.Test.D ...
- Spring源码学习
Spring源码学习--ClassPathXmlApplicationContext(一) spring源码学习--FileSystemXmlApplicationContext(二) spring源 ...
- Spring源码学习-容器BeanFactory(四) BeanDefinition的创建-自定义标签的解析.md
写在前面 上文Spring源码学习-容器BeanFactory(三) BeanDefinition的创建-解析Spring的默认标签对Spring默认标签的解析做了详解,在xml元素的解析中,Spri ...
- spring源码学习之路---深入AOP(终)
作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 上一章和各位一起看了一下sp ...
- spring源码学习之路---IOC初探(二)
作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 上一章当中我没有提及具体的搭 ...
- Spring源码学习-容器BeanFactory(三) BeanDefinition的创建-解析Spring的默认标签
写在前面 上文Spring源码学习-容器BeanFactory(二) BeanDefinition的创建-解析前BeanDefinition的前置操作中Spring对XML解析后创建了对应的Docum ...
- Spring源码学习-容器BeanFactory(二) BeanDefinition的创建-解析前BeanDefinition的前置操作
写在前面 上文 Spring源码学习-容器BeanFactory(一) BeanDefinition的创建-解析资源文件主要讲Spring容器创建时通过XmlBeanDefinitionReader读 ...
- Spring源码学习-容器BeanFactory(一) BeanDefinition的创建-解析资源文件
写在前面 从大四实习至今已一年有余,作为一个程序员,一直没有用心去记录自己工作中遇到的问题,甚是惭愧,打算从今日起开始养成写博客的习惯.作为一名java开发人员,Spring是永远绕不过的话题,它的设 ...
随机推荐
- 自定义DelegatingHandler为ASP.NET Web Api添加压缩与解压的功能
HTTP协议中的压缩 Http协议中使用Accept-Encoding和Content-Encoding头来表示期望Response内容的编码和当前Request的内容编码.而Http内容的压缩其实是 ...
- 没有80端口的备案域名,如何做微信公众平台的开发?本文介绍可以通过任何域名来做开发,www.baidu.com和www.163.com和www.so.com这样的域名都可以
1.首先做过微信开发的朋友都知道,微信后台需要绑定80端口的备案域名,如果此时手上没有80端口的备案域名就不能进行开发了吗?当然不是 首先在这些地方绑定一个备案域名,国内公司的网址基本上是有备案的如w ...
- jeecg中一对多的关系映射
1.首先看一张前端页面: 有一张主表和3张子表,显示这3张子表的代码如下 <t:tabs id="tt" iframe="false" tabPositi ...
- Web API 路由访问设置
前段时间一直致力于MVC webapi 技术的研究,中途也遇到过好多阻碍,特别是api路由的设置和URL的访问形式,所以针对这个问题,特意做出了记录,以供日后有同样困惑的大虾们借鉴: 在Mvc WEB ...
- C#String地址、拼接性能学习
String类型不可变.定义string变量时会在堆上分配存储空间,而对该变量进行值变更时会重新分配一个存储空间,且保留原存储空间. 测试思路:获取string类型变量值变更前后的存储空间地址,判断地 ...
- GOF23设计模式之适配器模式(Adapter)
一.适配器模式概述 将一个类的接口转换成客户可用的另外一个接口. 将原本不兼容不能在一起工作的类添加适配处理类,使其可以在一起工作. 二.适配器模式场景 要想只有USB接口的电脑想使用PS/2接口的键 ...
- Eclipse环境配置
7.打开Eclipse的偏好设置,我们需要对Eclipse做一下配置: 8.从左侧栏选择java下面的Installed JREs,然后点击Add按钮,我们要为Eclipse配置JDK: 9.选择“S ...
- mysql 数据库 自动截取数据的问题---mysql的sql_model的四种模式:宽松模式、严格模式
mysql支持的sql_mode模式:ANSI.TRADITIONAL.STRICT_ALL_TABLES和STRICT_TRANS_TABLES. ANSI模式:宽松模式,对插入数据进行校验,如果不 ...
- 搭建Lepus数据库监控系统-记录
一. 安装环境 系统环境:centos6.5 IP:192.168.30.242 hostname:vpn.org 软件:LAMP均已安装.(请确保这些正常安装,并能使用). 系统核心包:(摘自官方 ...
- OpenStack--Cinder(G版)中的volume type
一.volume type的相关操作 Cinder中的卷类型,是卷的一种标识,各个OpenStack的发行者可根据自身对系统的约束来定义卷类型的使用.G版的Cinder中与卷类型相关的两种资源:typ ...