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. TCP流量控制与拥塞控制

    为了更好地对传输层进行拥塞控制,因特网建议标准定义了以下四种算法:慢启动.拥塞避免.快重传和快恢复. 1 接收窗口rwnd与拥塞窗口cwnd 发送方在确定发送报文段的速率时,既要根据接收方的接收能力, ...

  2. Codeforces Round #353 (Div. 2) A. Infinite Sequence

    Vasya likes everything infinite. Now he is studying the properties of a sequence s, such that its fi ...

  3. 网卡添加VLAN TAG

    #modprobe 8021q 用命令 lsmod | grep 8021q 来检查 以配置网卡eth0为例,添加vlan号:1002 ================================ ...

  4. Java实现字符串反转

    替换原则:index k 的值和 n-k 的值进行交换.(始终记住程序员的n.k都是字符串的实际位置.) 乘除的最基本实现还是来源于移位操作. public String reverse(String ...

  5. Python可视化学习(1):Matplotlib的配置

    Matplotlib是一个优秀的可视化库,它提供了丰富的接口,让Python的可视化落地显得非常容易上手.本系列是本人学习python可视化的学习笔记,主要用于监督自己的学习进度,同时也希望和相关的博 ...

  6. Java注解(3)-注解处理器(编译期|RetentionPolicy.SOURCE)

    注解的处理除了可以在运行时通过反射机制处理外,还可以在编译期进行处理.在编译期处理注解时,会处理到不再产生新的源文件为止,之后再对所有源文件进行编译. Java5中提供了apt工具来进行编译期的注解处 ...

  7. Python内置函数(34)——filter

    英文文档: filter(function, iterable) Construct an iterator from those elements of iterable for which fun ...

  8. hdu 5885 FFT

    XM Reserves Time Limit: 10000/10000 MS (Java/Others)    Memory Limit: 102400/102400 K (Java/Others)T ...

  9. jsp 中文乱码

    解决jsp中文乱码问题的几个步骤 1 jsp页面设置        <%@ page language="java" contentType="text/html; ...

  10. 数据库设计和ER模型-------之数据库系统生存期(第二章)

    数据库设计 概念:开发人员利用开发环境表达用户要求.设计构造最优的数据模型,然后据此建立数据库以及其应用系统,这个过程称为数据库设计 数据库生存期 1968年首次提出“软件工程”的概念 概念:我们把数 ...