1、Spring 介绍

在早期 J2EE 时代,开发一个应用程序非常繁琐,先不说对象的创建及管理,如其它数据库访问、提供 Web 服务等都需耗费我们大量时间。当时一位名为 Rod Johnson 的澳大利亚人率先对这种 J2EE 系统框架臃肿、低效的种种现状提出了质疑,之后 Rod Johnson 编写《Expert one on one J2EE design and development》一书,通过书中阐述的部分理念和原型创建了Spring Framework 。(PS:Rod Johnson 居然是音乐学博士???)

Spring Framework 是一个轻量级的 Java开源框架,主要是为了解决企业应用开发的复杂性而创建。它的核心是帮助我们管理对象及其依赖关系,但还提供像通用日志记录、性能统计、安全控制、异常处理等面向切面的能力,还集成了大量的第三方框架,如数据库访问框架 Hibernate ,mybatis、Web 服务框架 Struts 、自身提供的SpringMVC,还有任务调度、Redis 缓存,Mq等。

Spring Framework 还致力于 J2EE 应用的各层解决方案,在表现层、业务层及持久层都集成了相应的功能框架,可以说 Spring 是企业应用开发的“一站式”解决方案。

但其实 J2EE 和 Spring 并不对立,Spring 是 J2EE 的补充,它将 J2EE 的各个规范集成在一起:

可以说 Spring 是“借鉴了”他山之石,来逐步实现自身的生态系统。

2、Spring 框架的演变

Spring 第一个版本于2002年10月发布,至今十几年间, Spring 框架的核心功能、社区支持等各方面都发展迅猛,所以有必要回顾一下Spring 每个里程碑版本所带来的重要特性。

  • Spring 0.9:这是该框架第一个公开发布的版本,以《Expert One-on-One: J2EE Design and Development》一书为基础,提供了 bean 配置基础、AOP 支持、JDBC 抽象框架、抽象事务支持等。该版本没有官方参考文档,但可以在SourceForge 上找到现有的源代码和文档。
  • Spring 1.x:这是发布的第一个带有官方参考文档的版本。由七个模块组成。
    • Spring Core、Spring Context、Spring DAO、Spring ORM、Spring AOP、Spring Web、Spring Web MVC
  • Spring 2.x:该版本由六个模块组成,Spring Context 模块融入了 Spring Core 中,Spring Web MVC 融入了 Spring Web 中。
    • 支持 AOP 开发的 @AspectJ 注解。
    • 完全支持异步JMS 消息驱动的POJO。
    • 为调度任务而引入的 TaskExecutor 抽象。
    • Java 5 注解支持,特别是 @Transactional、@Required 和 @AspectJ。
  • Spring 2.5.x:该版本包含以下功能。
    • 新增 @Autowired 注解以及对 JSR-250 注解(@Resource、@PostConstruct 和 @PreDestroy)的支持。
    • 新增注册 Bean 的相关注解:@Component、 @Repository、@Service 和 @Controller。
    • 除了Spring MVC @Controller 注解,还添加了 @RequestMapping、@RequestParam 和@ModelAttribute 注解,从而支持通过注解配置进行请求处理。
  • Spring 3.0.x:这是基于Java 5 的 Spring 第一个版本,旨在充分利用 Java5 的功能,如泛型、可变参数。
    • 支持 Java5 功能,例如泛型、可变参数。
    • 全面支持 REST。
    • 新的 MVC XML 名称空间和其他注解,例如 SpringMVC 中的 @CookieValue 和 @RequessHeaders。
    • 验证增强功能和 JSR-303 (Bean 验证)支持。
  • Spring 3.2.x:该版本包含以下功能。
    • 支持基于 Servlet 3.0 的异步请求处理。
    • 新的 SpringMVC 注解 @ControllerAdvice。
  • Spring 4.x:这是一个重要的 Spring 版本,也是第一个完全支持 Java 8 的版本。虽然仍然可以使用较旧的版本,但弃用的类和方法己被删除。
    • 全面支持 Hibernate ORM 5.0 。
    • JMS 和 Web 改进。
    • 对 WebSocket 消息传递的改进。
    • 引入了AopTestUtils 实用工具类,允许访问 Spring 代理的底层对象。
  • Spring 5.x:这是一个主要版本,整个框架都基于Java 8。
    • 充分利用Java 8 的强大功能,从而在性能上得到极大的改进。
    • 支持 JMS2.0+ 和 JPA 2.1+。
    • 引入了 Spring Web Flux,这是一个用于替代 SpringMVC 的项目,构建在反应式基础之上,完全是异步和非阻塞的。
    • Web 和核心模块适用于反应式编程模型。

3、Spring 整体架构

到了 Spring 5.0 时代,其模块大约有 20 个,如图:

这些模块被总结为以下几部分。

Core Container

Core Container(核心容器)包含 Core 、Beans 、Context 和 Expression Language 四个模块。

  • Core 模决主要包含 Spring 框架的核心工具类,是其他组件的基本核心。如动态代理相关的 asm、cglib,以及各种 Utils,StringUtils、CollectionUtils。
  • Beans 模块包含访问配置文件、创建和管理 bean 以及进行 IoC/DI 操作相关的所有类。如:BeanFactory、BeanDefinitions 等。
  • Context 模块构建于 Core 和Beans 模块基础之上,其继承了 Beans 的特性,为Spring 核心提供了大量扩展。ApplicationContext 接口是 Context 模块的核心。
  • Expression Language 模块提供了强大的表达式语言。就是在远古 JSP 时期使用的 EL 表达式。

Data Access/Integration

Data Access/Integration 包含 JDBC 、ORM 、OXM、JMS 和 Transaction 模块。

  • JDBC 模块提供了一个JDBC 抽象层,用来适配所有的数据库厂商。这个模块包含了 Spring 对 JDBC 数据访问进行封装的所有类。
  • ORM 模块提供了几种常用的对象关系映射框架,如 JPA 、Hibernate 、iBatis 。
  • OXM 模块提供了一个对ObjecνXML 映射实现的抽象层。
  • JMS (Java Messaging Service)模块主要包含一些生产和消费消息的特性。
  • Transaction 模块支持编程和声明性的事务管理。

Web

Web 层包含了Web 、Servlet 、WebSocket、Porlet 模块。

  • Web 模块:提供了基础的面向Web 的集成特性。例如,多文件上传。
  • Servlet 模块:该模块包含Spring 的model-view-controller (MVC)实现。
  • WebSocket 模块:提供 WebSocket 协议支持。
  • Porlet 模块:提供了用于 Portlet 环境和 Servlet 模块的 MVC 的实现

AOP

AOP 模块提供了一个符合 AOP 联盟标准的面向切面编程实现,它让你可以定义例如方法拦截器和切点,从而将逻辑代码分开,降低它们之间的耦合性。

  • Aspects 模块提供了对AspectJ 的集成支持。
  • Instrumentation 模块提供了class instrumentation 支持和classloader 实现,使得可以在特定的应用服务器上使用。
  • Messaging 模块:对消息通信集成提供了广泛的支持,及提供简化 JMS API 的使用到异步接收消息的完整基础结构。

Test

Test 模块支持使用 JUnit 和TestNG 对 Spring 组件进行测试。

最后

Spring 背景及架构就介绍到这,接下来将对 Spring 核心容器、AOP、事务这三部分内容展开一系列的讨论。

注:该系列文章使用的 Spring 版本是 5.0+。

以上就是本章内容,如果文章中有错误或者需要补充的请及时提出,本人感激不尽。

参考:

《Spring 源码深度解析(第二版)》
《Spring5 高级编程》
《SpringBoot 编程思想》
https://baike.baidu.com/item/spring/85061#2
https://docs.spring.io/spring/docs/5.2.2.RELEASE/spring-framework-reference/overview.html#overview

Spring(一)开篇的更多相关文章

  1. 玩转spring boot——开篇

    很久没写博客了,而这一转眼就是7年.这段时间并不是我没学习东西,而是园友们的技术提高的非常快,这反而让我不知道该写些什么.我做程序已经有十几年之久了,可以说是彻彻底底的“程序老炮”,至于技术怎么样?我 ...

  2. spring帝国-开篇

    spring简介: spring是一个开源框架,spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Dev ...

  3. spring boot + vue + element-ui全栈开发入门——spring boot后端开发

    前言 本文讲解作为后端的spring boot项目开发流程,如果您还不会配置spring boot环境,就请点击<玩转spring boot——快速开始>,如果您对spring boot还 ...

  4. Spring Boot 直接用jar运行项目

    概述 在Spring Boot 开篇-创建和运行一文中,介绍了如何创建一个Sprint Boot项目并且运行起来.但是运行的方式是在IDEA中直接Run起来的.还有另一中方式可以可以把Spring B ...

  5. 【Spring实战】----开篇(包含系列目录链接)

    [Spring实战]----开篇(包含系列目录链接) 置顶2016年11月10日 11:12:56 阅读数:3617 终于还是要对Spring进行解剖,接下来Spring实战篇系列会以应用了Sprin ...

  6. Spring Cloud Eureka(一): 开篇说明及目录汇总

    开篇简述 基于Spring Boot 和 Spring Cloud 的微服务应用,本人在工作中已经使用两年有余了,伴随着个人学习计划的实施,希望借助博文的方式,将工作中使用到的技术点体系化的总结出来, ...

  7. spring boot + vue + element-ui全栈开发入门——开篇

    最近经常看到很多java程序员朋友还在使用Spring 3.x,Spring MVC(struts),JSP.jQuery等这样传统技术.其实,我并不认为这些传统技术不好,而我想表达的是,技术的新旧程 ...

  8. 深入理解Spring系列之一:开篇

    转载 https://mp.weixin.qq.com/s?__biz=MzI0NjUxNTY5Nw==&mid=2247483810&idx=1&sn=a2df14fdb63 ...

  9. Spring源码解析(一)开篇

    前言 Spring源码继承结构比较复杂,看过以后经常会忘记.因此,记录一下源码分析的过程,方便以后回顾.本次分析的Spring源码版本为3.2.15. 另外,一提Spring就是IOC.DI等等,我们 ...

  10. Spring Boot☞HelloWorld开篇

    目录结构 POM.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns=&quo ...

随机推荐

  1. springboot activiti工作流简单示例

    最近一直研究springboot,根据工作需求,工作流需要作为一个单独的微服务工程来提供给其他服务调用,现在简单的写下工作流(使用的activiti)微服务的搭建与简单使用 jdk:1.8 数据库:m ...

  2. H3C 配置CHAP验证

  3. [转]1.2 java web的发展历史

    前言 了解java web的发展历史和相关技术的演进历程,非常有助于加深对java web技术的理解和认识. 阅读目录 1.Servlet的出现 2.Jsp的出现 3.倡导了MVC思想的Servlet ...

  4. mybatis查询无结果, 数据库运行相同sql查询出结果

    一.问题描述 mybatis查询无结果, 数据库运行相同sql查询出结果, 如下 这是数据库记录 这是mybatis查询出的结果, 记录条数0 这是直接将控制台一模一样的sql查询语句放到Navica ...

  5. 如何让索引只能被一个SQL使用

    有个徒弟问我,要创建一个索引,去优化一个SQL,但是创建了索引之后其他 SQL 也要用 这个索引,其他SQL慢死了,要优化的SQL又快.遇到这种问题咋搞? 一般遇到这种问题还是很少的.处理的方法很多. ...

  6. [转]C#操作Word的超详细总结

    本文中用C#来操作Word,包括: 创建Word: 插入文字,选择文字,编辑文字的字号.粗细.颜色.下划线等: 设置段落的首行缩进.行距: 设置页面页边距和纸张大小: 设置页眉.页码: 插入图片,设置 ...

  7. H5 数据存储localStorage

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. 2018-2-13-wpf-使用-Dispatcher.Invoke-冻结窗口

    title author date CreateTime categories wpf 使用 Dispatcher.Invoke 冻结窗口 lindexi 2018-2-13 17:23:3 +080 ...

  9. H3C IPv6地址构成

  10. linux 使用 ioctl 参数

    在看 scull 驱动的 ioctl 代码之前, 我们需要涉及的另一点是如何使用这个额外的参数. 如果它是一个整数, 就容易: 它可以直接使用. 如果它是一个指针, 但是, 必须小心些. 当用一个指针 ...