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-websocketspring-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整体架构和设计理念的更多相关文章

  1. Mybatis源码学习之整体架构(一)

    简述 关于ORM的定义,我们引用了一下百度百科给出的定义,总体来说ORM就是提供给开发人员API,方便操作关系型数据库的,封装了对数据库操作的过程,同时提供对象与数据之间的映射功能,解放了开发人员对访 ...

  2. spring源码解析1--spring整体架构

    一.Spring整体架构图 关于Spring的基本介绍就不再赘述了,先展示Spring框架的整体架构图如下示: 二.Spring结构介绍 Spring主要分为Core Container.Test.D ...

  3. Spring源码学习

    Spring源码学习--ClassPathXmlApplicationContext(一) spring源码学习--FileSystemXmlApplicationContext(二) spring源 ...

  4. Spring源码学习-容器BeanFactory(四) BeanDefinition的创建-自定义标签的解析.md

    写在前面 上文Spring源码学习-容器BeanFactory(三) BeanDefinition的创建-解析Spring的默认标签对Spring默认标签的解析做了详解,在xml元素的解析中,Spri ...

  5. spring源码学习之路---深入AOP(终)

    作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 上一章和各位一起看了一下sp ...

  6. spring源码学习之路---IOC初探(二)

    作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 上一章当中我没有提及具体的搭 ...

  7. Spring源码学习-容器BeanFactory(三) BeanDefinition的创建-解析Spring的默认标签

    写在前面 上文Spring源码学习-容器BeanFactory(二) BeanDefinition的创建-解析前BeanDefinition的前置操作中Spring对XML解析后创建了对应的Docum ...

  8. Spring源码学习-容器BeanFactory(二) BeanDefinition的创建-解析前BeanDefinition的前置操作

    写在前面 上文 Spring源码学习-容器BeanFactory(一) BeanDefinition的创建-解析资源文件主要讲Spring容器创建时通过XmlBeanDefinitionReader读 ...

  9. Spring源码学习-容器BeanFactory(一) BeanDefinition的创建-解析资源文件

    写在前面 从大四实习至今已一年有余,作为一个程序员,一直没有用心去记录自己工作中遇到的问题,甚是惭愧,打算从今日起开始养成写博客的习惯.作为一名java开发人员,Spring是永远绕不过的话题,它的设 ...

随机推荐

  1. 移动端固定头部和固定左边第一列的实现方案(Vue中实现demo)

    最近移动端做一份报表,需要左右滚动时,固定左边部分:上下滚动时,固定头部部分. 代码在Vue中简单实现 主要思路是: a.左边部分滚动,实时修改右边部分的滚动条高度 b.头部和内容部分都设置固定高度, ...

  2. shell常用测试命令

    预定义变量: 预定义变量是由Bash程序预先定义好的一类特殊变量,用户只能使用预定义变量,而不能创建新的预定义变量,也不能直接为预定义变量赋值.预定义比变量使用"$"符合和另一个符 ...

  3. ssi框架学习总结

    框架简介: 相信大家对于mvc的三层架构已经灰常熟悉了,在这就不细讲了,个人感觉ssi的框架结构还是比较典型的mvc三层架构,还是比较容易上手的.关于这块的入门我想特别感谢下FrankHui童鞋,在他 ...

  4. python接口自动化19-requests-toolbelt处理multipart/form-data

    requests-toolbelt 1.官方文档地址:requests-toolbelt官方文档 2.环境安装 pip install requests-toolbelt multipart/form ...

  5. java6枚举类型

    java.lang.Enum > 使用enum定义. 类如: public class EnumDemo { enum Edge { TOP, BOTTOM, LEFT, RIGHT//定义了一 ...

  6. 杂项:Vue.js

    ylbtech-杂项:Vue.js Vue.js(读音 /vjuː/, 类似于 view)是一个构建数据驱动的 web 界面的渐进式框架.Vue.js 的目标是通过尽可能简单的 API 实现响应的数据 ...

  7. Go - coding之前的准备

    Go tool 的使用 Go的tool要求我们对于code有一定的结构化组织和管理,下面我们就来一介绍他们: --GoPath environment variable:  顾名思义,环境变量,指定了 ...

  8. ALSA声卡09_从零编写之参数设置_学习笔记

    1.参数设置分析 (1)open: soc_pcm_open 依次调用cpu_dai, dma, codec_dai, machine的open或startup函数 只在dma的open函数里添加参数 ...

  9. IO模型之非阻塞IO

    1. IO模型非阻塞 IO Linux下,可以通过设置socket使其变为 non-blocking.当对一个non-blocking socket执行读操作时,流程是这个样子: 从图中可以看出,当用 ...

  10. array,vector对象 数组越界检测