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. AT命令控制上网 PDP

    1. AT+CGATT=1 (Attach or detach from GPRS service, GPRS 附着状态) 说的简单点,这一步就是让SGSN (服务GPRS节点,你可以把它理解成与基站 ...

  2. Fluent NHibernate AutoMapping Conventions

    前言 使用nhibernate在项目中不管是代码或者xml文件映射方式,如果项目较大编写映射也应该算一笔大的工作量了,使用Fluent Nhibernate自己编写映射规则,将从conventions ...

  3. sorl基本原理

    索引原理 场景:小时候我们都使用过新华字典,妈妈叫你翻开第38页,找到“坑爹”所在的位置,此时你会怎么查呢?毫无疑问,你的眼睛会从38页的第一个字开始从头至尾地扫描,直到找到“坑爹”二字为止.这种搜索 ...

  4. ESXI5-WIN2008R2安装域控以及额外域笔记

    每次安装域控都要找教程,每次都没法一次性搞定.写个笔记吧...主要是给自己看的.写的比较含糊.不清楚的可以直接QQ本人. 1.安装WIN2008R2,192.168.188.10 2.上载SLICET ...

  5. Linux的内存管理机制

    原文作者:技术成就梦想 链接:http://ixdba.blog.51cto.com/2895551/541355 一 物理内存和虚拟内存          我们知道,直接从物理内存读写数据要比从硬盘 ...

  6. 模拟admin组件自己开发stark组件之搜索和批量操作

    搜索相关,搜索的本质就是从数据库查询出来的数据过滤 用户自定义给出过滤条件joker.py list_display = ('id','title','price',) show_add_btn = ...

  7. 主从DNS服务器的搭建

    一.DNS主从的理解 主从服务器,在一开始的理解中,以为是主的dns服务器挂掉后,(dns服务自动转向辅助dns服务器),客户端还能继续解析.事实貌似不是这样的.当我把主dns停掉的时候,客户端只设一 ...

  8. IDA Pro 权威指南学习笔记(九) - 数据搜索

    Search -> Next Code 命令将光标移动到下一个包含指令的位置 Jump -> Jump to Function 命令可以打开所有函数,可以迅速选择一个函数并导航到该函数所在 ...

  9. Proof for Floyd-Warshall's Shortest Path Derivation Algorithm Also Demonstrates the Hierarchical Path Construction Process

    (THIS BLOG WAS ORIGINALLY WRTITTEN IN CHINESE WITH LINK: http://www.cnblogs.com/waytofall/p/3732920. ...

  10. Windbg在.net性能问题排查hang情况的应用思路

    1.使用~*kb 2000 查看本地锁的callstack情况,有sleep的线程关注是否占用锁,有wait等待的线程可能是正在等待锁资源. 2.使用~*e!clrstack 查看.net的calls ...