设计伊始

      Spring 是为解决企业级应用开发的复杂性而设计,她可以做很多事。但归根到底支撑Spring的仅仅是少许的基本理念,而所有地这些的基本理念都能可以追溯到一个最根本的使命:简化开发。这是一个郑重的承诺,其实许多框架都声称在某些方面做了简化。

而Spring则立志于全方面的简化Java开发。对此,她主要采取了4个关键策略:

1,基于POJO的轻量级和最小侵入性编程;

2,通过依赖注入和面向接口松耦合;

3,基于切面和惯性进行声明式编程;

4,通过切面和模板减少样板式代码;

而他主要是通过:面向Bean、依赖注入以及面向切面这三种方式来达成的。

面向Bean

     Spring 是面向 Bean 的编程(Bean Oriented Programming, BOP),Bean 在 Spring 中才是真正的主角。Bean 在 Spring 中作用就像 Object 对 OOP 的意义一样,Spring 中没有 Bean 也就没有 Spring 存在的意义。Spring 提供了 IoC容器通过配置文件或者注解的方式来管理对象之间的依赖关系。

控制反转( 其中最常见的方式叫做依赖注入(Dependency Injection,DI),还有一种方式叫“依赖查找”(Dependency Lookup,DL),她在C++、Java、PHP以及.NET中都运用。在最早的Spring中是包含有依赖注入方法和依赖查询的,但因为依赖查询使用频率过低,不久就被Spring移除了,所以在Spring中控制反转也被称作依赖注入),她的基本概念是:不创建对象,但是描述创建它们的方式。在代码中不直接与对象和服务连接,但在配置文件中描述哪一个组件需要哪一项服务。容器 (在 Spring 框架中是 IoC容器) 负责将这些联系在一起。

在典型的 IoC场景中,容器创建了所有对象,并设置必要的属性将它们连接在一起,决定什么时间调用方法。

  依赖注入

Spring 设计的核心 org.springframework.beans 包(架构核心是org.springframework.core包),它的设计目标是与 JavaBean 组件一起使用。这个包通常不是由用户直接使用,而是由服务器将其用作其他多数功能的底层中介。下一个最高级抽象是 BeanFactory 接口,它是工厂设计模式的实现,允许通过名称创建和检索对象。BeanFactory 也可以管理对象之间的关系。

BeanFactory 支持两个对象模型。

1,单例:模型提供了具有特定名称的对象的共享实例,可以在查询时对其进行检索。Singleton 是默认的也是最常用的对象模型。对于无状态服务对象很理想。

2,原型:模型确保每次检索都会创建单独的对象。在每个用户都需要自己的对象时,原型模型最适合。

bean 工厂的概念是 Spring 作为 IoC容器的基础。IoC则将处理事情的责任从应用程序代码转移到框架。

面向切面

面向切面编程,即 Aop,是一种编程技术,它允许程序员对横切关注点或横切典型的职责分界线的行为(例如日志和事务管理)进行模块化。Aop的核心构造是方面,它将那些影响多个类的行为封装到可重用的模块中。

Aop和 IoC是补充性的技术,它们都运用模块化方式解决企业应用程序开发中的复杂问题。在典型的面向对象开发方式中,可能要将日志记录语句放在所有方法和 Java 类中才能实现日志功能。在 Aop方式中,可以反过来将日志服务模块化,并以声明的方式将它们应用到需要日志的组件上。当然,优势就是 Java 类不需要知道日志服务的存在,也不需要考虑相关的代码。所以,用 Spring Aop编写的应用程序代码是松散耦合的。

Aop的功能完全集成到了 Spring 事务管理、日志和其他各种特性的上下文中。

俯瞰Spring源码架构

系统架构

Spring 总共大约有20个模块,由1300多个不同的文件构成。而这些组件被分别整合在核心容器(Core Container)、Aop(Aspect Oriented Programming)和设备支持(Instrmentation)、数据访问及集成(Data Access/Integeration)、Web、报文发送(Messaging)、Test,6个模块集合中。

以下是 Spring 4 的系统架构图。

组成 Spring 框架的每个模块集合或者模块都可以单独存在,也可以一个或多个模块联合实现。每个模块的组成和功能如下:

1.核心容器由spring-beans、spring-core、spring-context和spring-expression(Spring Expression Language, SpEL) 4个模块组成。

spring-beans和spring-core模块是Spring框架的核心模块,包含了控制反转(Inversion of Control, IoC)和依赖注入(Dependency Injection, DI)。BeanFactory 接口是Spring框架中的核心接口,它是工厂模式的具体实现。BeanFactory 使用控制反转对应用程序的配置和依赖性规范与实际的应用程序代码进行了分离。但 BeanFactory 容器实例化后并不会自动实例化 Bean,只有当 Bean 被使用时 BeanFactory 容器才会对该 Bean 进行实例化与依赖关系的装配。

spring-context模块构架于核心模块之上,他扩展了BeanFactory,为她添加了Bean生命周期控制、框架事件体系以及资源加载透明化等功能。此外该模块还提供了许多企业级支持,如邮件访问、远程访问、任务调度等,ApplicationContext是该模块的核心接口,她是 BeanFactory 的超类,与 BeanFactory 不同,ApplicationContext 容器实例化后会自动对所有的单实例 Bean 进行实例化与依赖关系的装配,使之处于待用状态。

spring-expression模块是统一表达式语言(unified EL)的扩展模块,可以查询、管理运行中的对象,同时也方便的可以调用对象方法、操作数组、集合等。它的语法类似于传统EL,但提供了额外的功能,最出色的要数函数调用和简单字符串的模板函数。这种语言的特性是基于 Spring 产品的需求而设计,他可以非常方便地同Spring IoC进行交互。

2.Aop和设备支持:由spring-aop、spring-aspects和spring-instrumentation 3个模块组成。

spring-aop是Spring的另一个核心模块,是Aop主要的实现模块。作为继OOP后,对程序员影响最大的编程思想之一,Aop极大地开拓了人们对于编程的思路。在Spring中,他是以JVM的动态代理技术为基础,然后设计出了一系列的Aop横切实现,比如前置通知、返回通知、异常通知等,同时,Pointcut接口来匹配切入点,可以使用现有的切入点来设计横切面,也可以扩展相关方法根据需求进行切入。

spring-aspects模块集成自AspectJ框架,主要是为Spring Aop提供多种Aop实现方法。

spring-instrumentation模块是基于JAVA SE中的"java.lang.instrument"进行设计的,应该算是Aop的一个支援模块,主要作用是在JVM启用时,生成一个代理类,程序员通过代理类在运行时修改类的字节,从而改变一个类的功能,实现Aop的功能。在分类里,我把他分在了Aop模块下,在Spring 官方文档里对这个地方也有点含糊不清,这里是纯个人观点。

 3.数据访问及集成:由spring-jdbc、spring-tx、spring-orm、spring-jms和spring-oxm 5个模块组成。

spring-jdbc模块是Spring 提供的JDBC抽象框架的主要实现模块,用于简化Spring JDBC。主要是提供JDBC模板方式、关系数据库对象化方式、SimpleJdbc方式、事务管理来简化JDBC编程,主要实现类是JdbcTemplate、SimpleJdbcTemplate以及NamedParameterJdbcTemplate。

spring-tx模块是Spring JDBC事务控制实现模块。使用Spring框架,它对事务做了很好的封装,通过它的Aop配置,可以灵活的配置在任何一层;但是在很多的需求和应用,直接使用JDBC事务控制还是有其优势的。其实,事务是以业务逻辑为基础的;一个完整的业务应该对应业务层里的一个方法;如果业务操作失败,则整个事务回滚;所以,事务控制是绝对应该放在业务层的;但是,持久层的设计则应该遵循一个很重要的原则:保证操作的原子性,即持久层里的每个方法都应该是不可以分割的。所以,在使用Spring JDBC事务控制时,应该注意其特殊性。

spring-orm模块是ORM框架支持模块,主要集成 Hibernate, Java Persistence API (JPA) 和 Java Data Objects (JDO) 用于资源管理、数据访问对象(DAO)的实现和事务策略。

spring-jms模块(Java Messaging Service)能够发送和接受信息,自Spring Framework 4.1以后,他还提供了对spring-messaging模块的支撑。

spring-oxm模块主要提供一个抽象层以支撑OXMOXM是Object-to-XML-Mapping的缩写,它是一个O/M-mapper,将java对象映射成XML数据,或者将XML数据映射成java对象),例如:JAXB, Castor, XMLBeans, JiBX 和 XStream等。

 4.Web:由spring-web、spring-webmvc、spring-websocket和spring-webmvc-portlet 4个模块组成。

spring-web模块为Spring提供了最基础Web支持,主要建立于核心容器之上,通过Servlet或者Listeners来初始化IoC容器,也包含一些与Web相关的支持。

spring-webmvc模块众所周知是一个的Web-Servlet模块,实现了Spring MVC(model-view-controller)的Web应用。

spring-websocket模块主要是与Web前端的全双工通讯的协议。(资料缺乏,这是个人理解

spring-webmvc-portlet模块是知名的Web-Portlets模块(Portlets在Web门户上管理和显示的可插拔的用户界面组件。Portlet产生可以聚合到门户页面中的标记语言代码的片段,如HTML,XML等),主要是为SpringMVC提供Portlets组件支持。

5.报文发送:即spring-messaging模块。

spring-messaging是Spring4 新加入的一个模块,主要职责是为Spring 框架集成一些基础的报文传送应用。

 6.Test:即spring-test模块。

spring-test模块主要为测试提供支持的,毕竟在不需要发布(程序)到你的应用服务器或者连接到其他企业设施的情况下能够执行一些集成测试或者其他测试对于任何企业都是非常重要的。

依赖关系

该图是SPRING 3.2.X 的包结构,可以从中清楚看出 Spring 各个模块之间的依赖关系。

从图中可以看出,IoC 的实现包 spring-beans 和 AOP 的实现包 spring-aop 是整个框架的基础,而 spring-core 则是整个框架的核心,基础的功能都在这三个包里。

在此基础之上,spring-context 提供上下文环境,为各个模块提供粘合作用。

在 spring-context 基础之上提供了 spring-tx 和 spring-orm包,而web部分的功能,都是要依赖spring-web来实现的。

由于struts框架自身的Bug一直没有修复,以及Spring MVC 已经足够强大,所以在最新的spring 4 中已经移除了 spring-struts 模块。

如果你想加入spring源码的学习,笔者的建议是从spring-core入手,其次是spring-beans和spring-aop,随后是spring-context,再其次是spring-tx和spring-orm,最后是spring-web和其他部分。

Spring 源码分析(一) —— 迈向Spring之路相关推荐

  1. Spring 源码分析(一) —— 迈向Spring之路(转载)

    看到很好的相关Spring的源码分析专题,就转了,若对作者有影响,请联系我删除该专题文章. 一切都是从Bean开始的 ‍ 在1996年,Java还只是一个新兴的.初出茅庐的编程语言.人们之所以关注她仅 ...

  2. Spring 源码分析 (一)——迈向 Spring 之路

    一切都是从 Bean 开始的 在 1996 年,Java 还只是一个新兴的.初出茅庐的编程语言.人们之所以关注她仅仅是因为,可以使用 Java 的 Applet 来开发 Web 应用.但这些开发者很快 ...

  3. spring源码分析第二天------spring系统概述以及IOC实现原理

    1.Spring5 概述 Spring 是一个开源的轻量级 Java SE(Java 标准版本)/Java EE(Java 企业版本)开发应用框架, 其目的是用于简化企业级应用程序开发. Spring ...

  4. Spring源码分析【1】-Tomcat的初始化

    org.apache.catalina.startup.ContextConfig.configureStart() org.apache.catalina.startup.ContextConfig ...

  5. spring源码分析之spring-core总结篇

    1.spring-core概览 spring-core是spring框架的基石,它为spring框架提供了基础的支持. spring-core从源码上看,分为6个package,分别是asm,cgli ...

  6. 【Spring源码分析】Bean加载流程概览

    代码入口 之前写文章都会啰啰嗦嗦一大堆再开始,进入[Spring源码分析]这个板块就直接切入正题了. 很多朋友可能想看Spring源码,但是不知道应当如何入手去看,这个可以理解:Java开发者通常从事 ...

  7. 【spring源码分析】IOC容器初始化(二)

    前言:在[spring源码分析]IOC容器初始化(一)文末中已经提出loadBeanDefinitions(DefaultListableBeanFactory)的重要性,本文将以此为切入点继续分析. ...

  8. spring源码分析第六天------spring经典面试问题

    spring源码分析第六天------spring经典面试问题 1.Spring5 新特性及应用举例 2.Spring 经典的面试问题 a.什么是 Spring 框架?Spring 框架有哪些主要模块 ...

  9. spring源码分析第五天------springAOP核心原理及源码分析

    spring源码分析第五天------springAOP核心原理及源码分析 1. 面向切面编程.可以通过预 编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术 切面(A ...

最新文章

  1. JavaEE之使用DOM4J和XPath对xml文档的添加,删除,查询操作
  2. (转)各种纹理贴图技术
  3. Mybatis常用总结:参数,返回,执行sql,include等
  4. 2022年终结版WPF项目实战合集发布
  5. Linux 文件IO管理 - POSIX
  6. 怎样选择宽带上网产品--解读上海电信政企宽带新套餐
  7. ASP.NET程序中常用的三十三种代码一
  8. php5.2.1.1,PHP 5.2.1
  9. MC34063中文资料及应用实例(转)
  10. 2017年Android恶意软件专题报告
  11. 查看WLC的SFP模块信息
  12. 使用python制作属于自己的地铁图
  13. ssize_t和size_t详解
  14. android自定义抽奖,Android 抽奖活动 (自定义view实现) 转盘
  15. 金融行业案例 | 未来智安XDR助力银行业客户优化安全运营体系,有效提高告警研判率
  16. 算法工程师属于计算机哪个领域,算法工程师、数据研发工程师,数据挖掘工程师的区别是什么?...
  17. 自动驾驶行业观察之2023上海车展-----车企发展趋势(1)
  18. py2neo.database.work.ClientError: [Procedure.ProcedureNotFound]
  19. CUDA out of memory解决办法
  20. Flutter 关于计步(一)

热门文章

  1. 2.11 求N分之一序列前N项和
  2. 用MOBA游戏的方式来评估候选人实力
  3. 美国计算机工程专业,2018年美国大学本科计算机工程专业Top10
  4. python的yield是什么意思,python生成器是怎么使用的 python中yield是什么意思
  5. html中web字体图标,响应式Web图形篇 —— icon fonts(字体图标)在网页中的应用...
  6. 计算机硬盘越大运行速度越大吗,电脑的内存越大越好吗?如果只加大内存,电脑反而会被拖慢!...
  7. SQL Server 2008 简体中文正式版下载地址(附序列号)
  8. 实验6-cp –r系统命令的实现--源路径(目录)中的所有文件和子目录,以及子目录中的所有内容,全部拷贝到目标路径(目录)中--操作系统实验
  9. 轨道交通通信施工学习总结(三)区间光电缆敷设
  10. C语言之最简单的Hello World!