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. Codeforces Round #205 (Div. 2)C 选取数列可以选择的数使总数最大——dp

    http://codeforces.com/contest/353/problem/C Codeforces Round #205 (Div. 2)C #include<stdio.h> ...

  2. erlang学习之自定义behaviour

    behaviour是啥,看了资料做了demo以后,感觉像接口,话不多说,祭代码 R15开始,回调模型使用callback来约定,更加好理解了 test_behavior.erl -module(tes ...

  3. VC编译选项 md /mdd /ml /mt/mtd

    VC编译选项 多线程(/MT)多线程调试(/MTd)多线程 DLL (/MD)多线程调试 DLL (/MDd)C 运行时库                        库文件Single threa ...

  4. 用活firewalld防火墙中的zone

    原文地址:http://www.excelib.com/article/290/show firewalld中zone的含义学生前面已经给大家介绍过了,说白了一个zone就是一套规则集.可是什么时候该 ...

  5. vue 跟路径加载缺少跟前缀

    vue 加载资源失败:跟路径残缺,都是配置时 一个正斜杠 / 多余惹的祸

  6. python调试方法

    之前调试python程序都是用print参数,感觉有点弱爆啊,最近发现python也有类似C语言gdb的工具pdb,记录下pdb的使用方法和心得. 先找了段简单的测试程序: 复制代码 !/usr/bi ...

  7. Java - 将 List 等分(最后一部分处理多余部分)

    背景 今天由于要使用多线程,所以事先需要确定启动线程个数.于是需要先将集合进行分配,确定线程的个数. 解决方案 首先是实现 public static <T> List<List&l ...

  8. 第八章 Health Check

    8.1 默认的健康检查 每个容器启动时会执行一个进程,此进程由Dockerfile的CMD或ENTRYPOINT指定.如果进程退出时返回码非零,则认为容器发生故障,K8s就会根据restartPoli ...

  9. Java复习——I/O与序列化

    File类 java.io.File只用于表示文件(目录)的信息(名称.大小等),不能用于文件内容的访问,我们可以通过通过给其构造函数传一个路径来构建以文件,传入的路径名有一个小问题,就是Window ...

  10. python 之 itertools模块

    官方:https://yiyibooks.cn/xx/python_352/library/itertools.html 参考: https://blog.csdn.net/neweastsun/ar ...