购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

第1章
Spring Framework入门

本章主要内容:

Spring Framework概述;

Spring Framework的发展历史;

Spring Framework的组成结构;

Spring生态核心成员。

回顾Spring Framework的历史已经有二十余载,从最初既烦琐又复杂的EJB开发到如今使用Spring Framework和Spring Boot就能快速搭建和开发应用,Spring家族可谓功不可没。如今的Java EE开发中掌握Spring已经成为一个开发者的必备技能,业界很有名的“Spring全家桶”也是目前主流的技术体系之一。在笔者的另一本图书《Spring Boot源码解读与原理分析》中也反复提到,Spring Boot的成功依托于Spring Framework的优秀基础,所以在本书的起始我们需要先对Spring Framework有一个基本的认识和了解。

1.1 Spring Framework概述

了解一门技术,首先要知道它是什么、都有什么、能做什么,而了解这些内容的最直接方式之一是借助官方网站和文档。从Spring的官方网站中找到Spring Framework的项目主页,可以发现如下描述。

The Spring Framework provides a comprehensive programming and configuration model for modern Java-based enterprise applications on any kind of deployment platform.

A key element of Spring is infrastructural support at the application level: Spring focuses on the "plumbing" of enterprise applications so that teams can focus on application-level business logic, without unnecessary ties to specific deployment environments.

Spring Framework为任何类型的部署平台上的基于Java的现代企业应用程序提供了全面的编程和配置模型。

Spring的一个关键要素是在应用程序级别提供基础架构支持:Spring专注于企业应用程序的“脚手架”,以便团队可以专注于应用程序级别的业务逻辑,而不必与特定的部署环境建立不必要的关联。

上述描述的内容中包含诸多要素,下面对其中的一些关键词做基本解释,方便读者更好地理解这段话的含义。

任何类型的部署平台:无论是操作系统,还是Web容器(如Tomcat等),都可以部署基于Spring Framework的应用。

企业应用程序:包含Java SE和Java EE在内的一站式解决方案。

编程和配置模型:基于框架进行编程,以及通过框架完成功能和组件的配置。

基础架构支持:Spring Framework不包含任何业务功能,它只是一个底层的应用抽象支撑。

脚手架:使用它可以更快速地构建应用。

另外,从网络上流传比较多的、认可度相对较高的概述中,我们也能发现一些新的关键词。

Spring Framework是一个分层的、Java SE/Java EE的一站式轻量级开源框架,以IOC和AOP为内核,提供表现层、持久层、业务层等领域的解决方案,同时还提供了整合第三方开源技术的能力。

Spring Framework是一个Java EE编程领域的轻量级开源框架,它是为了解决企业级编程开发中的复杂性、实现敏捷开发的应用型框架。Spring Framework是一个容器框架,它集成了各个类型的工具,通过核心的IOC容器实现了底层的组件实例化和生命周期管理。

Spring Framework是一个开源的容器框架,核心是IOC和AOP,它为简化企业级开发而生。Spring Framework有诸多优良特性(非侵入、容器管理、组件化、轻量级、一站式等)。

观察、品味这些概述,并且与官方文档中的描述进行比对,可以提取如下几个关键词。

轻量级:相较于重量级框架,它的规模更小(可能只有几个jar包)、消耗的资源更少。

IOC和AOP:这是Spring Framework的两大核心特性,即控制反转(Inverse of Control,IOC)和面向切面编程(Aspect Oriented Programming,AOP)。

整合第三方开源技术:Spring Framework可以很方便地整合第三方技术(如持久层框架MyBatis/Hibernate、表现层框架Struts2、权限校验框架Shiro等)。

容器:Spring Framework的底层有一个管理对象和组件的容器,由它来支撑基于Spring Framework构建的应用的运行。

一站式:覆盖企业级开发中的所有领域。

综合以上的官方权威概述和开发者的经验总结,本书也试着提取和总结一个尽可能表述完整且精简的概述:

Spring Framework是一个开源的、松耦合的、分层的、可配置的一站式企业级Java开发框架,它的核心是IOC与AOP,它可以更容易地构建企业级Java应用,并且可以根据应用开发的组件需要,整合对应的技术。

简单解释一下如此概括的要点。

加入“松耦合”的概念是为了强化IOC和AOP的描述(两者都是降低耦合的手段)。

加入“可配置”是为了给Spring Boot垫底(Spring Boot非常重要的特性之一)。

IOC和AOP可提可不提,只要是对Spring有最基础了解的读者都应该知道。

没有提“轻量级”,是考虑到现在大环境的趋势已没有EJB的身影。

没有提“容器”的概念,是因为Spring Framework不仅仅是一个容器,如果只限定在容器层面,那相当于收窄含义。

注意对比“企业级Java开发”与“Java EE开发”的区别:Spring Framework不仅能构建Web项目,也可以构建和开发普通的Java SE项目、GUI项目。

总的来看,Spring Framework是一个功能极其强大的基础型框架,其设计考虑之周全,决定了几乎任何Java应用都可以从Spring Framework中受益。

1.2 Spring Framework的发展历史

Spring Framework的发展过程非常漫长,最早要回到1997年,美国著名的IT公司IBM面对企业应用的J2EE(现在的Java EE,2021年更名为Jakarta EE)开发时,制定出了一套技术思想,称为EJB(Enterprise JavaBean),并且对外宣称企业级应用开发就应该按照EJB的思想来开发,使用EJB是一个标准的、规范的开发方式。

后来EJB思想被Sun公司(Java的创始公司)相中,并在1998年以规范的形式整合进Java体系中,与当时J2EE的其他技术规范一起联合(包括JMS、JNDI、JSP等),合称为“J2EE开发的核心技术”。随后,IBM公司的开发者将EJB规范加以实现,并在2002年更新2.0版本,在当时的J2EE开发中可谓红极一时,各大公司团队都以EJB作为企业级开发的标准。

EJB虽然很强大,但EJB的实现本身是个重量级框架,对应用业务的代码侵入度较高,并且伴随着高昂的学习成本和开发成本,这使得使用EJB的开发者经常叫苦不迭。不过即便如此,当时业界的开发者也没有更好的解决方案,所以只能一边叫苦,一边含泪使用。

整个僵局在2002年被打破,一位名叫Rod Johnson的开发者出版了一本图书: Expert One-on-One J2EE design and development ,里面对当时现有的J2EE应用的架构和框架存在的臃肿、低效等问题提出了质疑,并且积极寻找和探索解决方案。两年后的2004年3月,Spring Framework 1.0.0横空出世,随后的2004年6月,Rod Johnson又写了一本书,在当时的J2EE开发界引起了巨大轰动,它就是著名的 Expert one-on-one J2EE Development without EJB ,这本书中直接告诉开发者完全可以不使用EJB开发J2EE应用,而是换用一种更轻量级、更简单的框架,那就是Spring Framework。

Spring Framework在最初创立时就不是为了站在J2EE开发的对立面,而是借助IOC和AOP的思想,对J2EE的开发方式予以补充。除此以外,Spring Framework提供的底层模块和特性都比EJB好。虽然EJB 3.0开始提出了更轻量化的方式(Entity Bean和Session Bean),但在当时EJB大势已去,基于Spring Framework的J2EE开发已经成为行业标准。

时至今日,Spring Framework已经发展到6.x版本,按照时间排序,Spring Framework的版本迭代如表1-1所示。

表1-1 Spring Framework的版本迭代

小提示:

Spring Framework项目同时维护了最新的6.x,以及较早的5.x甚至4.x,其中当前主流的版本又包含不同类型的小版本,它们都代表着不同的含义,本节将予以补充。

GA:正式版本,代表正式发行的可用版本,在实际的项目开发中必须使用GA版本,从Maven/Gradle中获取的依赖也是GA版本。

CURRENT:最新版本,代表最新发行的正式版本,包含最新发布的特性、Bug修复等,在实际项目开发中要避免使用。通常在项目开发中选择的版本都是有一定用户规模的稳定版本,避免使用太新的版本,防止可能存在的潜在漏洞导致出现意外。

SNAPSHOT:快照版本,代表团队迭代的还没有正式发布的版本,一般情况下快照版本中会存在一些可以被发现的Bug,开发团队会在发布SNAPSHOT版本后的一段时间内收集Bug信息并予以修正,之后发布对应的正式版本。

M1、M2等:里程碑版本,代表一个版本的预览版本,在此类版本中,会推出新特性、修改大量问题并进行性能优化等。

RC1、RC2等:候选发行版本,同样是预览版本,但从生命周期角度来看要晚于里程碑版本。

1.3 Spring Framework的组成结构

Spring Framework是一个分层的架构,它包含一系列核心要素,并大体分为若干模块。以下简单描述这些核心模块的含义及作用。

(1)IOC 及 IOC 容器

Spring Framework的底层核心是一个容器,由于其充分体现了IOC的特性,因此又被称为IOC容器。IOC部分包含Spring Framework最基础的核心代码core、与组件对象相关的beans、与容器上下文相关的context,以及支持SpEL表达式相关的expression模块。整个IOC模块是Spring Framework的基础,后续的所有模块都建立在此之上。

(2)AOP

AOP是基于面向对象编程(OOP)的补充,它可以支持开发者定义一些方法的切入点和增强器,用于将一些通用逻辑代码与业务功能代码相分离,降低其耦合度。由于AOP建立在IOC模块的基础上,因此能够充分利用IOC容器和Bean组件的特性,使得容器中所管理的bean对象都可以支持AOP。

(3)数据访问

对绝大部分的应用程序而言,主要关注的问题就是与数据库、数据存储的访问和操作。Spring Framework没有局限于针对某一种数据存储类型的场景做文章,而是以一个更高的层次,通过抽取 jdbc、orm、tx 等模块,制作了一套访问关系型数据库的通用抽取模板,通过引入模板的设计和思想将数据访问变得非常简单。此外,借助AOP的思想,Spring Framework还提供了声明式事务等功能。

(4)Web

Spring Framework在整合Web环境中也有对应的WebMvc和WebFlux技术实现,通过引入不同的模块,可以实现基于传统Servlet API的WebMvc开发,或者完全不依赖Servlet API的WebFlux实现响应式Web开发;另外通过引入不同的页面和模板引擎,可以使得Spring Framework支持多种视图层技术。此外,基于HTML5规范的WebSocket也在Spring Framework 4.0中予以支持。

(5)测试

测试是企业应用开发不可或缺的一部分,Spring Framework通过整合不同的单元测试框架,可以实现简单高效的代码单元测试;借助IOC容器和Web相关特性支持,可以在开发Web项目中实现集成测试。

1.4 Spring生态核心成员

打开Spring的官网项目列表页,可以看到Spring生态的众多项目成员,这些项目共同组成了一个非常健全且强大的企业级应用开发解决方案。除了本书重点讲解的Spring Framework和Spring Boot,微服务解决方案Spring Cloud、整合系生态成员Spring Data、Spring Security等都是非常优秀的单一领域解决方案。为了能让读者对Spring生态的核心成员有一个大体的了解,下面以表格形式对其中重要的项目进行简单介绍,如表1-2所示。

表1-2 Spring生态的核心成员简介

1.5 开发环境准备

为了读者能顺利地向下阅读,学习Spring Framework和相关技术的使用,需要先行准备Java开发环境和开发工具。本书使用的Java开发环境及工具介绍如表1-3所示。

表1-3 本书使用的Java开发环境及工具介绍

下面逐个准备和安装。笔者在编写本书时使用的操作系统为Windows 10,故如无特殊说明,本书中所有的操作均基于Windows 10演示。

1.5.1 安装JDK

安装JDK时读者可以选择使用Oracle官方提供的JDK,也可以选择OpenJDK。由于2019年Oracle JDK调整了商业策略,不允许被用于商业用途,所以本书使用的是OpenJDK。从Oracle官网就可以找到OpenJDK 17的下载安装包,按照以下步骤下载安装即可。

(1)下载OpenJDK压缩包,下载的位置如图1-1所示。

图1-1 下载OpenJDK 17安装包

(2)将压缩包解压至一个没有中文名的目录中(笔者解压的位置可供参考,如图1-2所示)。

图1-2 解压JDK压缩包至无中文名目录

(3)新建环境变量JAVA_HOME,它的值为上一步解压的文件夹路径;修改环境变量PATH,新建项并输入值“%JAVA_HOME\bin”。

如此操作后,JDK即安装完毕,读者可打开cmd,输入java -version检查安装是否正确,当正确输出JDK的版本时即代表安装成功。

1.5.2 安装Maven

对于基于Spring Framework的项目,可以使用Maven或者Gradle构建,本书涉及的所有项目均使用Maven来构建。由于本书选择使用IDEA作为开发工具,而IDEA中已经集成了Maven,因此可以不用安装Maven(当然前提是不介意IDEA把项目依赖的jar包下载到C盘)。笔者在搭建开发环境时选择单独安装Maven 3.6.3作为外置Maven运行,这样做的目的是可以更方便地修改配置和全局使用。

小提示:

在安装和使用Maven之前,请务必完成JDK的安装和环境变量配置,否则会导致Maven无法正常工作。

从Maven的官方网站中找到Maven 3.6.3版本的zip包,下载并解压到没有中文名的目录下,之后将解压的目录全路径复制,并配置到环境变量的PATH中(操作方式与安装JDK类似)。

最后我们进入Maven的安装目录,找到conf文件夹下的settings.xml文件,这是Maven运行时会加载的配置文件,我们需要配置Maven的仓库位置(防止将所有依赖的jar包下载到C盘),以及指定使用阿里云的镜像仓库(官方的中央仓库加载速度较慢,国内使用阿里云的镜像仓库会快很多)。相关的配置如代码清单1-1所示。

代码清单1-1 Maven的settings.xml配置文件
<localRepository>E:/maven/repository</localRepository>
 
<mirrors>
    <mirror>
        <id>nexus-aliyun</id>
        <mirrorOf>*</mirrorOf>
        <name>Nexus aliyun</name>
        <url>https://maven.aliyun.com/repository/public/</url>
    </mirror>
</mirrors>

1.5.3 安装IDEA

本书在编写时全程使用IntelliJ IDEA作为开发工具,读者可以直接从JetBrains的官方网站下载IDEA的安装包并安装即可。安装完毕后,建议安装以下几个插件,以便后续的开发。

AspectJ:支持AOP开发。

Lombok:简化代码。

MyBatisX:辅助MyBatis整合开发。

1.6 小结

本章简单介绍了Spring Framework的概况、发展历史、核心模块以及生态体系的重要成员。Spring体系中最核心的基础就是Spring Framework,掌握它之后,在后续学习Spring Boot以及相关技术整合时都会变得更加轻松。

本章没有实际开始Hello World项目编写,因为第2章中需要用一个场景推演来让读者亲自体会Spring Framework的核心思想之一: 控制反转 4CwxhGjrZhRbIoonctkpPMhB2PO45CpI/yOMPSbAnpaI+aXk6YrezMeoFBQf3Xx+

点击中间区域
呼出菜单
上一章
目录
下一章
×