Spring Boot开发与测试实战

978-7-115-59733-5
作者: 李泳
译者:
编辑: 谢晓芳

图书目录:

详情

本书首先介绍Spring、Spring Boot、Spring MVC和Spring Security等技术,然后以一个简易的在线书店管理系统为例,全面讲解采用JPA/MyBatis、MySQL、Thymeleaf与Bootstrap技术栈开发应用程序的过程。开发过程中引入菱形测试模型,覆盖单元测试、接口测试、功能测试和探索测试等方法,并开展关键字驱动测试和数据驱动测试。本书基于分层测试框架,结合实践案例说明如何实施测试,有助于项目研发人员提高测试效率和产品成熟度。 本书不仅适合测试人员、开发人员阅读,还可作为相关培训机构的教材。

图书摘要

版权信息

书名:Spring Boot开发与测试实战

ISBN:978-7-115-59733-5

本书由人民邮电出版社发行数字版。版权所有,侵权必究。

您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。

我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。

如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。

编  著 李 泳

责任编辑 谢晓芳

人民邮电出版社出版发行  北京市丰台区成寿寺路11号

邮编 100164  电子邮件 315@ptpress.com.cn

网址 http://www.ptpress.com.cn

读者服务热线:(010)81055410

反盗版热线:(010)81055315

读者服务:

微信扫码关注【异步社区】微信公众号,回复“e59733”获取本书配套资源以及异步社区15天VIP会员卡,近千本电子书免费畅读。


本书首先介绍Spring、Spring Boot、Spring MVC和Spring Security等技术,然后以一个简易的在线书店管理系统为例,全面讲解采用JPA/MyBatis、MySQL、Thymeleaf与Bootstrap技术栈开发Spring Boot的过程。开发过程中引入菱形测试模型,覆盖单元测试、接口测试、功能测试和探索测试等方法,并开展关键字驱动测试和数据驱动测试。本书基于分层测试框架,以测试理论和实践案例相结合的方式来说明如何实施测试,有助于项目研发人员提高测试效率和产品成熟度。

本书可作为测试人员、开发人员、软件质量保障人员等的学习用书,也可作为相关培训机构的教材。


敏捷开发和精益开发等方法的推广使用,促使测试不断转型,尤其是在敏捷开发过程中,几乎没有单一的测试角色,开发人员即测试人员,测试人员即开发人员。敏捷开发要求团队成员都是“多面手”,需要他们具备满足开发和测试需求的技术,于是,团队成员需要了解系统的开发和测试过程。

在实际的产品或项目开发过程中,大部分的测试只停留在业务层面。为了增加产品测试的深度和广度,测试人员需要更多地参与到系统架构设计、功能设计、代码实现和性能优化等开发活动中,这就体现了“测试左移”。在这个过程中,开发人员的角色和测试人员的角色互换,可促进双方的沟通、互动,并从不同的角度来探查和审视产品质量,评估产品质量,提升产品质量。

当前,大多数企业级应用程序是基于Spring开发的。Spring中的开源框架Spring Boot极大地提高了企业级应用程序开发的效率,如今已经成为流行的开发框架。市面上与Spring开发相关的图书大多缺少对测试过程的详细介绍,讲解测试过程的图书主要围绕Python开发和接口测试展开,而本书就是一本针对Java技术栈的测试图书。实际上,在企业级应用程序开发中,Spring开发占了较大比例,Spring Boot已成为开发Web应用程序的标配,因此充分了解Spring Boot的开发过程和细节不仅能够帮助测试人员有效提高测试覆盖率,还能帮助开发人员有针对性地对代码进行检查,从而提高产品上线版本的成熟度。

本书共21章。

第1章~第3章分别介绍了Spring Boot、Spring MVC和Spring Boot程序。

第4章讲解JPA和MyBatis集成。

第5章介绍了前端开发框架Bootstrap。

第6章介绍模板框架Thymeleaf。

第7章介绍Spring Security。

第8章讲解Spring Boot测试框架。

第9章~第15章对案例进行需求分析,介绍如何创建案例项目,如何对用户管理模块、角色权限、图书管理模块、订单管理模块进行数据库设计和后端接口设计,如何实现前端代码,如何实现RESTful API。

第16章讲解分层测试框架。

第17章讲解如何结合案例特点进行测试工具选型。

第18章~第21章分别讲解单元测试脚本开发、接口测试脚本开发、功能测试脚本开发和探索测试。

在阅读本书之前,读者需要有一些Java使用经验,并需要了解一些HTTP和HTML知识。具体的学习建议如下。

编写代码并执行。学习编程的好方法是读者按照书上的代码自己写一遍,然后运行。

观察代码运行结果,分析代码运行过程中可能产生的问题。通过观察并分析,读者可以不断总结经验,加深对编程的理解。

本书具有以下特色。

通俗易懂,适合初学者。本书是一本关于Spring Boot 开发和测试的入门图书,从分析案例需求开始介绍,覆盖了需求分析、项目创建、模块的设计及实现、单元测试、接口测试和功能测试等环节。

内容实用。本书内容实用,可以帮助读者快速了解Spring Boot开发过程和测试分层脚本设计过程。通过学习如何用代码实现具体的接口,读者可掌握开发框架和测试分层模型的应用。

可操作性强。针对案例,本书从搭建环境入手,详细介绍如何编写程序代码和测试脚本,并结合源代码实现测试过程,帮助读者一步步了解整个测试过程。读者可跟随本书中的案例进行实践,因此本书是一本操作性强的图书。

感谢我的家人和好友在本书编写过程中提供的大力支持!同时,感谢人民邮电出版社的编辑给予我的支持和写作指导!

由于本人水平有限,因此书中难免出现一些不足或不准确的地方。若读者在阅读本书过程中发现任何问题或需要帮助,欢迎提出,我将尽力给予解答或帮助。

李 泳


本书由异步社区出品,社区(https://www.epubit.com)为您提供后续服务。

您还可以扫码右侧二维码, 关注【异步社区】微信公众号,回复“e59733”直接获取,同时可以获得异步社区15天VIP会员卡,近千本电子书免费畅读。

作者和编辑尽最大努力来确保书中内容的准确性,但难免会存在疏漏。欢迎您将发现的问题反馈给我们,帮助我们提升图书的质量。

当您发现错误时,请登录异步社区,按书名搜索,进入本书页面,单击“提交勘误”,输入错误信息,单击“提交”按钮即可。本书的作者和编辑会对您提交的错误信息进行审核,确认并接受后,您将获赠异步社区的100积分。积分可用于在异步社区兑换优惠券、样书或奖品。

我们的联系邮箱是contact@epubit.com.cn。

如果您对本书有任何疑问或建议,请您发邮件给我们,并请在邮件标题中注明本书书名,以便我们更高效地做出反馈。

如果您有兴趣出版图书、录制教学视频,或者参与图书翻译、技术审校等工作,可以发邮件。

如果您所在的学校、培训机构或企业想批量购买本书或异步社区出版的其他图书,也可以发邮件给我们。

如果您在网上发现有针对异步社区出品图书的各种形式的盗版行为,包括对图书全部或部分内容的非授权传播,请您将怀疑有侵权行为的链接通过邮件发送给我们。您的这一举动是对作者权益的保护,也是我们持续为您提供有价值的内容的动力之源。

“异步社区”是人民邮电出版社旗下IT专业图书社区,致力于出版精品IT图书和相关学习产品,为作译者提供优质出版服务。异步社区创办于2015年8月,提供大量精品IT图书和电子书,以及高品质技术文章和视频课程。更多详情请访问异步社区官网https://www.epubit.com。

“异步图书”是由异步社区编辑团队策划出版的精品IT专业图书的品牌,依托于人民邮电出版社几十年的计算机图书出版积累和专业编辑团队,相关图书在封面上印有异步图书的Logo。异步图书的出版领域包括软件开发、大数据、人工智能、测试、前端、网络技术等。

异步社区

微信服务号


Spring是一个开源的Java EE(Java Enterprise Edition)应用程序开发框架,是为应对企业级应用程序开发复杂性而创建的,其设计初衷是替代当时非常“笨重”的企业Java组件(Enterprise Java Beans,EJB),让Java EE应用程序开发变得更加简单、灵活。

Spring包含很多子项目,如Spring MVC、Spring Security和Spring Data等,几乎可以满足项目开发的所有需求。这是它能够成为Web项目开发首选框架的原因之一。

框架的主要作用是把大量最佳实践的经验固化,从而降低开发人员的使用成本,让开发人员专注于做什么,而不是怎么做。例如,常见的Web分层框架通常将技术或接口的实现细节隐藏,不仅让架构师和开发人员关注项目技术结构设计,还让开发人员更关注某一层业务与功能的实现。

Spring的核心功能是将所有模块和组件整合成一个应用程序。这个过程中,首先读取配置说明(如XML配置、Java的配置等),然后在应用程序上下文中初始化Bean,将Bean注入依赖它们的其他Bean。

Spring的主要优势如下。

轻量级。Spring基于POJO(Plain Ordinary Java Object)模型,是轻量级框架。

非侵入式方法。Spring并不强制扩展类或接口。

低耦合。由于使用依赖注入(Dependency Injection,DI),因此Spring对象是低耦合的。

模块化。Spring采用模块化设计,只能使用所需的模块。

易于测试。依赖注入和POJO模型使应用程序易于测试。

事务管理。Spring为事务管理提供事务管理接口。

不需要应用程序服务器。以前的Struts或EJB应用程序需要运行应用程序服务器,但Spring应用程序不需要应用程序服务器。

模型-视图-控制器(Model-View-Controller,MVC)框架。无缝集成Spring MVC框架,这让程序员更加关注业务逻辑。

对于初学者,想要了解Spring,需要先熟悉一些术语,如容器、POJO、Bean、耦合度、依赖、依赖注入等,下面分别进行介绍。

1.容器

生活中的容器是用于盛放东西的器具。从程序的角度来看,容器是装“对象”的对象,管理对对象的整个生命周期,即负责从创建、获取到回收的全过程。

2.POJO

POJO即简单旧式Java对象,是指那些不依赖任何特定环境的类或接口。POJO没有从任何类继承,没有实现任何接口,也没有被其他框架注入。

3.Bean

Bean就是由容器初始化、装配和管理的对象。Spring的核心是IoC容器。容器的职能包括对应用程序对象进行实例化、初始化和装配,以及在对象的整个生命周期中Spring的其他功能。这些被容器创建和管理的标准Java对象称为Bean。这些Java对象都是POJO。Bean的作用如下。

以某种方式配置Spring(数据库连接参数、安全性等)。

使用依赖注入避免硬编码依赖项,以便代码的类保持独立且可进行单元测试。

4.配置元数据

配置元数据用于向容器提供相关的信息,以便实例化Bean并制订对这些Bean进行装配的方法。配置元数据的传统格式是XML,可以选择注解,或基于Java的配置元数据。容器首先获取应用程序中编写的类,并与配置元数据结合,然后创建和装配Bean。

5.依赖

Spring的重要特性是依赖注入。想要了解依赖注入,需要先了解什么是依赖。我们先看架构层的依赖。一个典型的Java应用程序的体系结构包含Web层、业务层和数据层。其中,Web层依赖业务层,业务层是Web层的依赖项;业务层依赖数据层,数据层是业务层的依赖项。关于类级别的依赖例子如下列代码所示,BookImpl是业务类,它的实现方法需要使用productDo和itemDo这两个数据层类,因此productDo和itemDo是BookImpl的依赖项。

@Service
public class BookImpl implemented Book {
    @Autowired
    Product productDo;
    @Autowired
    Item itemDo;
    @Override
    public int getBookSum(int isdn) {
        ...
    }

6.非侵入式设计

从程序角度来看,如果不需要继承框架提供的类,这种设计就可以看作非侵入式设计。如果继承了框架提供的类,并且想要更换框架,则无法重用之前的代码。如果程序采用了非侵入式设计,那么旧的代码任何时候都可以进行重用。

7.轻量级

轻量级设计一般是指非侵入式设计,依赖项比较少,容易部署和使用。相对应的是重量级设计,它一是侵入式指设计,通常很难对它进行重构。

8.依赖注入

依赖注入是指在Spring创建对象的过程中,将对象所依赖的属性注入。依赖注入让相互协作的软件保持松耦合,其目的是提高组件重用的频率,并为系统搭建一个灵活可扩展的框架。通过依赖注入机制,只需要简单的配置,无须任何代码,就可指定目标需要的资源,完成自身的业务逻辑,而不需要关心具体的资源来自何处、由谁实现。

9.耦合度

耦合度表示结合的紧密程度。在程序中,耦合度是指模块间关联和依赖的程度。耦合度的高低取决于模块间接口的复杂度、调用模块的方式,以及通过界面传送数据的规模。模块间的耦合是指模块之间的依赖关系,包括控制关系和调用关系、数据传递关系。模块间联系越多,其耦合度越高,同时表明其独立性越弱,降低耦合度,可以增强其独立性。

10.控制反转

Spring框架最重要的特性是依赖注入。所有Spring模块的核心是依赖注入或控制反转。当正确使用依赖注入时,我们可以开发出低耦合的应用程序,同时,可以轻松地对该低耦合的应用程序进行单元测试。

控制反转是指创建的对象责任的反转,就是将原本在程序中手动创建对象的控制权交由容器管理,由容器创建对象并将它们注入应用程序。把对象的创建交给外部容器完成的过程称为控制反转。为什么称为控制反转呢?因为传统的方法是直接在对象内部通过new()方法创建对象,是主动创建依赖对象的方式,而现在由容器来创建对象并注入依赖对象。

控制反转的优点如下。

控制反转使代码低耦合。

控制反转可以帮助程序员轻松地编写出色的单元测试用例。

下面先看一个没有控制反转的例子(传统的实现方法)。

@RestController
public class WelcomeController {
    private WelcomeService service = new WelcomeService();
    @RequestMapping("/welcome")
    public String welcome() {
        return service.retrieveWelcomeMessage();
    }
}

上面的代码中,WelcomeController依赖WelcomeService,从而获取欢迎消息。WelcomeController类直接创建了一个实例WelcomeService,这意味着它们紧密关联。这是传统的实现方法。这种方法在代码中直接创建一个依赖对象,代码产生了高耦合。在这种情况下,当进行单元测试时,为WelcomeService创建一个模拟的对象很困难。接下来,我们看一个用控制反转实现低耦合的例子(使用Spring解耦)。

@Component
public class WelcomeService {
    ...
}

@RestController
public class Welcome Controller {
{
    @Autowired
    WelcomeService service;

    @RequestMapping("/welcome")
    public String welcome() {
        return service.retrieveWelcomeMessage();
    }
}

在上面的例子中,使用Spring的两个简单的注解——@Component和@Autowired。首先,通过@Component通知Spring框架,这里有一个需要管理的Bean。然后,通过@Autowired通知Spring框架,需要找到这个特定Bean的正确匹配并自动加载它。在上面的代码中,Spring将为WelcomeService创建一个Bean,并将其自动加载到WelcomeController中。在单元测试中,要求Spring将WelcomeService的模拟实例自动连接到WelcomeController。在Spring Boot中,使用@MockBean实现,具体过程请参考下文。现在,Spring框架自动装配WelcomeService到WelcomeController的依赖关系。在为WelcomeController编写单元测试用例时,使用WelcomeService模拟对象而不是实际依赖项。

11.AOP

在面向对象的编程过程中,不可避免地会出现代码重复问题。面向切面编程(Aspect Oriented Programming,AOP)对这些重复代码进行管理,将解决某个切面问题的代码单独放在某个模块中,再植入程序。简单来说,AOP允许你把遍布应用程序各处的功能分离以形成可重用的组件。

Spring本身具有非常好的模块化架构,包含了20多个模块。这些模块可以单独使用,也可以组合使用,所有模块通过依赖注入组合在一起。依赖注入使设计和测试低耦合的软件模块变得更容易。Spring模块如图1-1所示。

图1-1 Spring模块

下面对关键模块进行介绍。

1.Data Access/Integration(数据访问和集成)

Spring为实现数据和集成层提供了多种选择,包括以下重要的数据访问模块。

JDBC:使用JDBC与关系数据库通信,简化访问过程。

ORM:提供与所有ORM(对象关系映射,如Hibernate和MyBatis)框架的良好集成。

JMS:提供了通过队列与另一个应用程序通信的能力,Spring与JMS有很好的集成。

OXM:在需要对象到XML映射的场景中提供良好的集成。

Transactions:数据访问和集成功能的重要组成部分。Spring对事务管理有很好的支持。

2.Web

Spring对开发Web应用程序提供了很好的支持。

WebSocket:提供Socket通信功能支持。

Servlet:提供Spring MVC框架实现支持。

Web:提供框架所需的核心类,包括自动载入Web Application Context特性的类、Struts集成类、文件上传的支持类、Filter类和大量辅助工具类。

Portlet:提供Web模块功能的聚合功能支持。

3.AOP

AOP提供面向切面的编程实现,它提供了定义方法拦截器的工具。

AOP对达到安全性和实现日志记录等非常有用。Spring中的AOP提供基本的AOP功能。Spring提供了与AspectJ框架的良好集成,以执行高级AOP。

4.Aspects

它是面向切面模块的重要组成部分,提供对AspectJ框架的整合支持。

5.Instrumentation

Instrumentation提供对JVM和Tomcat的检测。

6.Messaging

Messaging提供消息处理功能。

7.Core Container(核心容器)

这是Spring中使用次数最多的部分,包括以下模块。

Beans:管理应用程序依赖项,Beans模块提供了BeanFactory。

Core:提供Spring的基本功能,包括控制反转和依赖注入。

Context:维护应用程序的上下文模块,提供一种访问任何对象的方法。ApplicationContext接口是Context模块的重要组成部分。

SpEL:表达式语言模块,提供了一种在运行时操作对象的方法。

8.Test

Spring的Test模块为单元测试和集成测试提供了很好的支持,并提供了大量模拟对象来支持它们。

随着Spring深入应用,烦琐的配置问题日益突出,每次在构建项目的时候都在不断地重复进行环境配置。同时,在框架整合过程中,对于一些共同依赖的JAR包,存在着潜在的冲突和风险,这使一些复杂的整合任务变得困难起来。

为了解决此类问题,产生了Spring Boot这一全新框架。Spring Boot用来简化Spring应用程序的搭建和开发过程。该框架致力于实现免XML配置,提供便捷、独立的运行环境,实现一键运行满足快速开发应用程序的需求。

Spring Boot是一种能够轻松创建具有最小配置或零配置的应用程序的方法。它是Spring的一站式解决方案。它简化了使用Spring的难度。Spring Boot受到关注与推崇的原因如下。

简化依赖管理:在Spring Boot中,提供了一系列的启器POM,对各种功能性模块进行划分与封装,让用户可以轻松地添加所需的依赖项,有效地避免用户在构建传统Spring应用程序时维护大量依赖关系而引发的JAR冲突等问题。

自动化配置:Spring Boot为每一个启动器都提供了自动化的Java配置类,用来替代传统Spring应用程序在XML中烦琐且并不需要太大变化的Bean配置;同时借助一系列的条件注解修饰,使用户能轻松地替换这些自动化配置的Bean并进行扩展。

遵循默认配置方法,以减轻开发人员的工作量。Spring Boot提供了嵌入式HTTP服务器,如Tomcat、Jetty等,可用于轻松地开发和测试Web应用程序。

生产级的监控端点:Spring-Boot-starter-actuator是Spring Boot在Spring 基础上的另一个重要创新,它有助于Spring应用程序的工程化。虽然该模块不能帮助我们实现任何业务功能,但是能在架构运维层面给予我们更多的支持。通过该模块提供的HTTP接口,我们可以轻松地了解Spring Boot应用程序的运行情况并加以控制。

方便集成:Spring Boot应用程序与Spring JDBC、Spring ORM、Spring Data、Spring Security等Spring模块的集成非常方便。

提供CLI(命令行界面)工具:通过命令提示符快速运行和测试Spring Boot(Java或Groovy)应用程序。

提供许多插件:使用Maven和Gradle等构建工具轻松地开发和测试Spring Boot应用程序。

虽然Spring Boot是基于Spring构建的,但是通过支持上面这些特性,改变了我们使用 Spring 的方式,极大地简化了构建企业级应用程序的配置操作。对于很多初学者来说,这使Spring Boot变得更加容易入门和使用。

Spring Boot有5个核心组件。

1.Spring Boot Starter

Spring Boot Starter的主要作用是将一组公共或相关的依赖项组合成单个依赖项。我们使用Tomcat WebServer开发Spring Web应用程序,然后在Maven的pom.xml文件中添加以下最小JAR包依赖项。

<dependency>
    <groupId>org.Springframework</groupId>
    <artifactId>Spring-core</artifactId>
    <version>4.3.12.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.Springframework</groupId>
    <artifactId>Spring-Web</artifactId>
    <version>4.3.12.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.Springframework</groupId>
    <artifactId>Spring-Webmvc</artifactId>
    <version>4.3.12.RELEASE</version>
</dependency>

这需要我们在构建文件中定义很多依赖项?对于开发人员,这是一项烦琐的工作,同时增加了构建文件中配置的内容。

如何避免在构建文件中定义这么多依赖项?使用Spring Boot Starter。

Spring Boot Starter将所有相关的JAR组合成单个JAR包,以便我们能将JAR包依赖项添加到构建文件中。我们只需要添加一个JAR包——Spring-Boot-starter-Web,而不是将上述这几个JAR包都添加到构建文件中。

<dependency>  
<groupId>org.Springframework.Boot</groupId>  
<artifactId>Spring-Boot-starter-Web</artifactId>  
<version>2.1.3.RELEASE</version>  
</dependency>

当我们将Spring-Boot-starter-Web依赖项添加到构建文件中时,Spring Boot将自动下载所有必需的JAR包依赖项并添加到项目类路径中。Spring Boot Starter避免了定义许多依赖项,降低了项目构建的依赖性。

2.Spring Boot AutoConfigurator

Spring Boot AutoConfigurator的主要作用是减少Spring的配置。如果我们在Spring Boot中开发Spring应用程序,那么不再需要定义单个XML配置,只定义少量注解就可以达到配置的目的,Spring Boot AutoConfigurator负责提供这些信息。如果声明一个Spring MVC应用程序,那么需要定义很多XML配置,如视图解析器等。如果我们使用Spring Boot,那么Spring Boot AutoConfigurator将帮助我们避免进行那些烦琐的XML配置,如果我们在构建文件中包含Spring-Boot-starter-Web依赖项,那么Spring Boot AutoConfigurator将自动解析视图并查看视图解析器等。另外,Spring Boot还减少了注解配置的内容。如果我们在类级别使用@SpringBootApplication注解,那么Spring Boot AutoConfigurator将自动添加所有必需的注解。

@SpringBootApplication注解的定义如下。

@Target(value=TYPE)
@Retention(value=RUNTIME)
@Documented
@Inherited
@Configuration
@EnableAutoConfiguration
@ComponentScan
public @interface SpringBootApplication

也就是说,@SpringBootApplication = @Configuration + @ComponentScan + @EnableAuto Configuration。

Spring Boot Starter依赖Spring Boot AutoConfigurator。Spring Boot Starter会自动触发Spring Boot AutoConfigurator。

3.Spring Boot CLI

Spring Boot CLI是一个Spring Boot软件,通过命令提示符运行和测试Spring Boot应用程序。当我们使用Spring BootCLI运行Spring Boot应用程序时,它在内部使用Spring Boot Starter和Spring Boot AutoConfigurator来解析所有依赖项并执行应用程序。

4.Spring Initializr

要快速构建新的Spring Boot项目,使用Spring官网的“Spring Initializr”页面。

5.Spring Boot Actuator

Spring Boot Actuator为Spring Boot应用程序提供管理端点并管理应用程序指标。

当我们使用Spring Boot CLI运行Spring Boot应用程序时,Spring Boot Actuator会自动使用主机名“localhost”,默认端口号为“8080”。我们可以使用“http://localhost:8080/”访问此应用程序。

Spring Boot应用程序的创建方法有很多,本节介绍其中的3种。

使用Spring Boot CLI。

使用Spring STS IDE。使用IDEA或Eclipse提供的STS(Spring Tool Suite,Spring开发工具套件)选择相关的Spring Boot Starter。

使用Spring官网提供的“Spring Initializr”页面来初始化程序信息并创建程序,然后下载自动生成的项目文件的ZIP压缩包并导入开发工具。

Spring Boot框架是Spring的扩展。它是为消除开发Spring应用程序所需的样板配置而推出的,有助于用户快速、有效地设置应用程序。它提供了开箱即用的配置,可以开发不同类型的Spring应用程序。但将现有的Spring项目迁移到Spring Boot并不容易,建议用户将Spring Boot主要用于新开发应用程序。

简而言之,Spring Boot只是Spring本身的扩展,主要作用是使开发、测试和部署变得更加方便,极大地缩短应用程序的开发时间。

微信扫码关注【异步社区】微信公众号,回复“e59733”获取本书配套资源以及异步社区15天VIP会员卡,近千本电子书免费畅读。


Spring MVC是一个实现了Web MVC设计模式请求驱动的轻量级Web框架。它是Spring的一个子框架,与Spring无缝集成。

Spring MVC的优势如下。

可以进行更简洁的Web层开发。

提供强大的约定大于配置的契约式编程支持。

容易与其他视图技术集成。

支持静态资源。

支持RESTful风格等。

Spring MVC通过协同工作将组件组合在一起,从而构建一个功能齐全的用户界面。通常,Java Web应用程序架构包括以下3层。

DAO层:数据映射(域对象或实体类)定义。

服务层:也称为业务层,定义业务处理逻辑。

表示层:用户操作界面展示。

Spring MVC程序可采用Java配置方式和XML配置方式创建。

使用Java配置方式创建一个Spring MVC程序的步骤如下。

1.创建一个新的Maven项目

(1)启动Eclipse,创建一个新的Maven项目。

(2)在菜单栏中,选择“File”→“New”→“New Maven Project”。

(3)选中“Create a simple project”复选框,单击“Next”按钮。

(4)在“Group Id”文本框中输入“com.jeff”,在“Artifact Id”文本框中输入“hello”,从“Packaging”下拉菜单中选择“war”,单击“Finish”按钮,Maven项目的相关信息如图2-1所示。

图2-1 Maven项目的相关信息

2.使用Maven将Spring及其依赖的组件自动添加到Maven项目中

打开Maven项目的根目录中的pom.xml配置文件,添加Spring依赖的组件,如Servlet API、Spring Core和Spring MVC等。Maven会将Spring及其依赖的组件自动下载到Eclipse项目的Maven Dependencies目录中。

  <build>
     <finalName>Spring</finalName>
       <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
                  <artifactId>maven-war-plugin</artifactId>
                  <version>2.5</version>
              <configuration>
                 <failOnMissingWebXml>false</failOnMissingWebXml>
              </configuration>
          </plugin>
      </plugins>
  </build>

<dependencies>
  <dependency>
     <groupId>Javax.servlet</groupId>
     <artifactId>Javax.servlet-api</artifactId>
     <version>3.1.0</version>
     </dependency>

    <dependency>
          <groupId>org.Springframework</groupId>
          <artifactId>Spring-context</artifactId>
          <version>4.3.14.RELEASE</version>
     </dependency>

          <dependency>
          <groupId>org.Springframework</groupId>
          <artifactId>Spring-Webmvc</artifactId>
          <version>4.3.14.RELEASE</version>
          </dependency>
</dependencies>

3.创建配置类AppConfig

AppConfig是一个Spring配置类,它是一个标准的Java类。右击Maven项目文件,选择“New”→“Package”,单击“New Java package”,输入“com.jeff.config”。然后,在新建的包下,创建类,类名为“AppConfig”。在该类中,添加如下代码。

import org.Springframework.context.annotation.ComponentScan;
import org.Springframework.context.annotation.Configuration;
import org.Springframework.Web.servlet.config.annotation.EnableWebMvc;
@Configuration    //声明为Spring配置类
@EnableWebMvc  //这使Spring能够接受和处理Web请求 
@ComponentScan (basePackages = {"com.jeff.controller"}) //扫描指定包 
public class AppConfig {

}

4.在com.jeff.config包中,创建ServletInitializer类

ServletInitializer类是Spring的服务端程序Servlet的配置类,它取代了web.xml配置文件。它将由SpringServletContainerInitializer类自动检测,可由任何Servlet自动调用。

ServletInitializer类扩展了AbstractAnnotationConfigDispatcherServletInitializer抽象类和实现所需的方法。

import org.Springframework.Web.servlet. support. 
AbstractAnnotationConfig DispatcherServletIn itializer;    

public class ServletInitializer extends AbstractAnnotationConfig Dispatcher
ServletInitializer {
    @Override 
    protected Class<?>[] getRootConfigClasses() {
        return new Class<?>[0];
    } 
    @Override
    protected Class<?>[] getServletConfigClasses() {//声明了Spring配置类
        return new Class<?>[]{AppConfig.class};
    }

    @Override
    protected String[] getServletMappings() {//声明了Servlet根路径的URL
        return new String[]{"/"};
    }
}

5.创建一个控制器类,返回“Hello, world!”信息

控制器类是处理HTTP请求的方法的类,带@Controller注解。每个处理程序都使用@RequestMapping进行注解,并提供了调用信息。

在com.jeff.controller包中,创建了一个控制器类HelloWorld和方法hello(),代码如下。

import org.Springframework.stereotype.Controller;
import org.Springframework.Web.bind.annotation.RequestMapping;
import org.Springframework.Web.bind.annotation.ResponseBody;

@Controller
public class HelloWorld {
    @RequestMapping("hello")
    @ResponseBody
    public String hello() {
    return "Hello, world!";
    }
}

使用/hello路由的请求将调用hello()方法。

6.运行Spring Web应用程序

具体操作如下。

(1)在Eclipse的“Package Explorer”视图中,选择“hello”文件夹。在菜单栏中,选择“Run”→“Maven install”,在target目录下生成spring.war文件。

(2)将该文件复制到Tomcat的webapps文件夹中。

(3)启动Tomcat,Tomcat将检测到sping.war文件,并自动加载应用程序。

(4)在浏览器中访问http://localhost:8080/spring/hello,程序运行结果如图2-2所示。

图2-2 运行结果

http://localhost:8080/spring/hello的组成部分介绍如下。

http是超文本传输协议。

localhost是应用程序服务器所在机器域名或IP地址。

8080是可以访问应用程序服务器的端口号。

spring是Web应用程序的上下文。

/hello是请求映射值。

XML配置方式创建Spring MVC程序的步骤如下。

(1)创建一个新的Maven项目。

(2)使用Maven将Spring及其依赖的组件添加到Maven项目中。打开pom.xml文件并将以下JAR依赖包添加到Maven项目中。注意,此处与2.2.1节的配置略有不同,具体代码如下。

<build> 
   <finalName>Springxml</finalName>
     <plugins>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.5</version>
        </plugin>
    </plugins>
</build>

<properties>
    <maven.compiler.target>1.8</maven.compiler.target>
    <maven.compiler.source>1.8</maven.compiler.source>
</properties>

<dependencies>
<dependency>
       <groupId>Javax.servlet</groupId>
       <artifactId>Javax.servlet-api</artifactId>
       <version>3.1.0</version>
</dependency>

<dependency>
        <groupId>org.Springframework</groupId>
        <artifactId>Spring-context</artifactId>
        <version>4.3.14.RELEASE</version>
    </dependency>

      <dependency>
        <groupId>org.Springframework</groupId>
        <artifactId>Spring-Webmvc</artifactId>
        <version>4.3.14.RELEASE</version>
        </dependency>
</dependencies>

(3)创建新的Spring配置文件web.xml。在src/main/webapp文件夹中新建目录WEB-INF,然后在新建的目录中创建配置文件web.xml。web.xml文件的内容如下。

<?xml version="1.0" encoding="UTF-8"?>
<Web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns="http://xmlns.jcp.org/xml/ns/Javaee" 
      xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/Javaee 
      http://xmlns.jcp.org/xml/ns/Javaee/Web-app_3_1.xsd" 
      id="WebApp_ID" version="3.1">
      <!-- 配置加载Spring文件的监听器-->
     <!-- 配置文件所在位置 -->

    <!-- 编码过滤器 -->
    <filter>
        <filter-name>encoding</filter-name>
        <filter-class>
             org.Springframework.Web.filter.CharacterEncodingFilter
        </filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>encoding</filter-name>
        <url-pattern>*.action</url-pattern>
    </filter-mapping>

    <!-- 配置Spring MVC前端核心控制器 -->
    <servlet>
        <servlet-name>Springmvc</servlet-name>
        <servlet-class> org.Springframework.Web.servlet.DispatcherServlet</
        servlet-class>
            <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/Springmvc-config.xml</param-value>
        </init-param>
        <!-- 配置服务器启动后立即加载Spring MVC配置文件 -->
    <!--将使用名为contextConfigLocation的参数初始化,该参数包含XML配置的路径 -->

            <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
    <servlet-name>Springmvc</servlet-name>
    <!--/:拦截所有请求(除JSP)-->
    <url-pattern>/</url-pattern>

通过Servlet映射,我们将Servlet类绑定到一个URL模式,该模式指定它将处理哪些HTTP请求。load-on-startup是一个整数值,指定多个Servlet的加载顺序。因此,如果需要声明多个Servlet,则可以定义它们的初始化顺序。

在web.xml配置文件中配置Spring监听器ContextLoaderListener并启动Web容器后,将自动装配ApplicationContext接口的配置信息,若找不到配置信息,那么应用程序会抛出配置信息异常。

<listener>
      <listener-class>org.Springframework.Web.context.ContextLoaderListener</listener
      -class>
 </listener>

(4)创建新的Spring配置文件springmvc-config.xml。

<Beans xmlns="http://www.Springframework.org/schema/Beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xmlns:mvc="http://www.Springframework.org/schema/mvc"
  xmlns:context="http://www.Springframework.org/schema/context"
  xmlns:tx="http://www.Springframework.org/schema/tx"
  xsi:schemaLocation="http://www.Springframework.org/schema/Beans 
  http://www.Springframework.org/schema/Beans/Spring-Beans-4.3.xsd 
  http://www.Springframework.org/schema/mvc 
  http://www.Springframework.org/schema/mvc/Spring-mvc-4.3.xsd 
  http://www.Springframework.org/schema/context 
  http://www.Springframework.org/schema/context/Spring-context-4.3.xsd">
        <!-- 配置包扫描器,扫描@Controller注解的类 -->
        <context:component-scan base-package="com.jeff.hellowithxml" />

        <!-- 加载注解驱动 -->
        <mvc:annotation-driven />
</Beans>

(5)创建一个控制类Hello WorldXml,返回“Hello, world!”信息。

package com.jeff.hellowithxml;

import org.Springframework.stereotype.Controller;
import org.Springframework.Web.bind.annotation.RequestMapping;
import org.Springframework.Web.bind.annotation.ResponseBody;

@Controller
Public class HelloWorldXml {
        @RequestMapping("hello")
        @ResponseBody
        Public String hello() {
        return "Hello, world!";
        }
}

(6)运行Spring Web应用程序。浏览器中访问http://localhost:8080/springxml/hello,程序运行结果与图2-2一致。

Spring Web应用程序使用模型-视图-控制器(Model-View-Controller,MVC)设计模式来处理HTTP请求。如图2-3所示,用户发起HTTP请求(如路由到/user/list),然后执行控制器方法。控制器(Controller)是POJO用@Controller注解的简单Bean,每个控制器类都包含通过@RequestMapping映射到请求URL的方法注解,用于处理不同的HTTP请求。最后,呈现视图(如JSP文件),并返回生成的HTML页面作为响应。

图2-3 HTTP请求处理过程

下面介绍HTTP请求的处理机制。其中一个核心组件是前端控制器DispatcherServlet,它是每个Spring Web应用程序的入口。DispatcherServlet将HTTP请求转换为控制器组件的命令,然后将命令分派给处理程序,并管理呈现的数据。它充当了整个应用程序的前端控制器。

DispatcherServlet通常在web.xml中进行定义,默认使用WebApplicationContext作为上下文,Spring默认配置文件为/WEB-INF/servlet.xml。Spring MVC请求的处理机制如图2-4所示。

图2-4 Spring MVC请求的处理机制

请求的处理过程如下。

(1)用户发送请求到前端控制器DispatcherServlet。

(2)DispatcherServlet接收用户的请求,通过映射处理(HandlerMapping)确定哪个控制器可以处理请求。通常在XML或注解中查找控制器,然后将请求传递给该控制器。

(3)控制器执行业务逻辑(可以将请求委托给服务或业务逻辑处理器)并返回一个可以渲染模型的视图的名称,同时向DispatcherServlet返回一些信息,用于用户响应。注意,此时并不直接发送信息(模型)给用户。

(4)DispatcherServlet把视图的名称传递给ViewResolver以进行视图解析,返回解析后的物理视图。

(5)DispatcherServlet将模型对象传递给视图。通过这种方式,DispatcherServlet就从视图实现中分离出来了。

(6)通过视图渲染模型。视图可以是JSP页面、Servlet或任何可呈现的组件。

(7)DispatcherServlet向用户响应结果。

Spring MVC是基于MVC设计模式构建的,Spring Web应用程序中的入口是DispatcherServlet,它是一个应用程序的前端控制器,其作用是拦截HTTP请求并将它们分派给将处理请求的组件。

Spring有两种配置方式——Java配置方式和XML配置方式。因为XML配置方式需要进行烦琐的Servlet和过滤器(filter)的配置,以及Spring Boot的普及,所以XML配置方式基本不再使用。但考虑到兼容性,Spring保留了XML配置方式。

微信扫码关注【异步社区】微信公众号,回复“e59733”获取本书配套资源以及异步社区15天VIP会员卡,近千本电子书免费畅读。


相关图书

深入浅出Spring Boot 3.x
深入浅出Spring Boot 3.x
云原生Spring实战Spring Boot与?Kubernetes实践
云原生Spring实战Spring Boot与?Kubernetes实践
Java研发自测入门与进阶
Java研发自测入门与进阶
Spring实战(第6版)
Spring实战(第6版)
Spring核心技术和案例实战
Spring核心技术和案例实战
Java EE企业级应用开发实战(Spring Boot+Vue+Element)
Java EE企业级应用开发实战(Spring Boot+Vue+Element)

相关文章

相关课程