从SSM进阶到Spring Boot课程的教学内容设计

2022-10-24 20:04王崟陆莉莉
电脑知识与技术 2022年26期

王崟 陆莉莉

摘要:SSM框架和Spring Boot框架是近些年主流的Java企业级应用框架。文本分析了两种框架的关系以及差异,给出了在具备SSM基础的前提下,Spring Boot课程的教学重点分析。最后详细介绍了Spring Boot课程的教学内容组织和实施过程。

关键词:SSM;Spring Boot;教学内容设计

中圖分类号:G642        文献标识码:A

文章编号:1009-3044(2022)26-0163-04

1 引言

SSM(Spring+SpringMVC+MyBatis)框架是近些年常见的Java企业级应用开发的框架,它能使项目具有高度的可维护性和扩展性[1]。而传统SSM框架繁重的配置以及集成第三方技术难度大等缺点使得Spring Boot框架产生了。一些软件技术专业除了开设基本的Java Web课程之外,也会开设这些框架课程。本人所在专业先开设SSM课程,然后再以两周实训形式开设Spring Boot课程。本人通过教学经验,浅谈在具备SSM基础的前提下,如何开展Spring Boot教学。详细介绍了课程的教学内容设计,特别是与SSM课程的衔接。

2 SSM和Spring Boot框架的关系以及开发中的差异

2.1 SSM和Spring Boot框架的关系

Spring Boot是Spring家族的一个子项目,它的设计目的是用来简化基于Spring的应用的搭建以及开发过程。Spring Boot框架可以看成一个“自动化”配置的框架,它让构建独立的Spring生产级别应用变得简单,它可以对Bean进行自动化的配置[2]。配置简化之后,开发人员能更专注于应用程序功能,不用在配置上花太多功夫。如果在Spring Boot框架下开发基于Spring MVC和Mybatis的应用,从控制器代码到持久层代码的编写上并无明显区别。

2.2 从SSM到Spring Boot开发上的差异

根据上面介绍的两种框架之间的关系,在从SSM进阶到Spring Boot的过程中,两者开发上的差别如下:

(1) 依赖管理的差别

在使用SSM框架的时候需要加入很多不同的第三方依赖,还得自行调配依赖的版本。一个SSM项目可能需要在POM中添加十几个甚至更多的依赖。

而Spring Boot通过提供众多起步依赖来降低项目依赖的复杂度,起步依赖名字中都含有“starter”。起步依赖本质上是一个POM,定义了对其他库的传递依赖,这些依赖组合起来,即可支持某项功能[3]。这样开发的时候只需要加入少量的starter依赖即可进行某种特定类型的应用开发。例如:做基本的Spring开发,只要加入spring-boot-starter,就会把Spring的基本依赖都传递进来。如果要做Web开发,只要加入spring-boot-starter-web依赖。开发者不需要再考虑具体需要哪些Jar包,引入相关起步依赖就行了。

除此之外,起步依赖中各个依赖版本之间的兼容性都经过了精心的测试,基本不用担心冲突。此外Spring Boot利用Maven的依赖管理功能,继承了很多常用库的依赖版本,添加依赖时就可以不用指定版本号。

(2) 配置的差别

在SSM框架中往往使用XML方式配置和装配第三方Bean,因此项目中会存在大量配置文件来配置第三方Bean。而通过Java方式注册和装配Bean是Spring Boot推荐的配置方式,其可以根据依赖自动创建、配置和装配Bean,开发者只需要写少量必需的配置即可。配置方式也从XML格式的Spring配置文件转变为properties属性文件或者yml文件。

3 从SSM进阶到Spring Boot框架的教学重点分析

由于Spring Boot框架和SSM框架的重点差异在于“自动化”配置,而不在于应用程序代码本身。学生已经学过了SSM课程,对于这三个框架的基本使用已经无须再重复学习,学习的重点就落在了如何让学生理解“自动化”配置是如何实现的,以及如何将一个SSM应用转换成基于Spring Boot的应用。Spring Boot教学重点分析如下:

3.1 强化“自动化”配置实现的基础

Spring Boot自动化配置的基本思路就是根据特定条件来控制Bean的创建。因此通过Java方式注册和装配Bean是Spring Boot实现自动化配置的基石之一,结合@Conditional条件注解,便可以通过代码来控制Bean的创建,这是使用XML配置Bean做不到的。此外由于Spring Boot将使用外部属性文件来进行配置,所以必须理解外部属性注入Bean的几种方式。

3.2 学习使用起步依赖

在开发Spring Boot项目时,在POM中继承spring-boot-starter-parent。此外也不需要再添加独立的单个依赖,直接添加Spring Boot相应的起步依赖就行了。学生必须学习如何选择和添加需要的起步依赖。除了直接使用起步依赖,还要学会如何覆盖起步依赖引入的传递依赖。例如Spring Boot默认使用内置Tomcat,如果想使用Jetty,可以把starter-tomcat排除,添加starter-jetty。如果打算部署到本地Tomcat,不使用内置服务器,可以直接排除starter-tomcat。如果添加的起步依赖中包含的某个传递依赖的版本不合适,可以将其排除,再添加一个合适版本的依赖。

3.3 学习写自己的Starter

为了能更好地理解自动化配置,应该学习写一个包含自动化配置的Starter,模仿Spring Boot的自动配置,并将自己写的Starter依赖加入某个Spring Boot项目中,观察其如何根据条件在启动过程中创建Bean[4]。

3.4 将SSM传统案例改造成基于Java方式注册和装配Bean

SSM课的传统案例均是使用XML方式来配置和装配第三方Bean。在学习Spring Boot的时候可以将其改造成基于Java方式注册和装配Bean。通过这种方式可以很清楚地看出进行某方面开发时,需要哪些最基本的Bean及它们之间的关联,以及这些Bean如何被创建出來,需要用户提供哪些配置属性。之后再引入Spring Boot自动配置和外部属性,删除自定义的Java配置类,便能明白Spring Boot做了哪些自动配置。

4 Spring Boot课程教学内容和实施过程

实际教学中,Spring Boot课程以两周实训的形式安排在SSM课程结束之后。Spring Boot学习和开发内容如下:

4.1 通过Java方式注册和装配Bean

在此阶段并不使用Spring Boot的自动配置,但为了和之后的Spring Boot依赖接轨,直接加入Spring Boot的起步依赖,而不是单独加入Spring依赖。这部分内容以文档和小项目形式教授下面内容:

(1) 通过Java方式注册和装配Bean

使用一个案例进行几个Bean的创建和装配,学习@Configuration和@Bean注解的使用,多个配置类的组合使用,使用@ComponentScan注解扫描包来发现配置类。具体教学内容如表1所示:

(2) 从属性文件注入值

由于Spring Boot将使用外部属性文件来进行配置,为了理解这些外部属性如何用来配置Bean,需要学习引入外部属性文件,并将属性值注入Bean。注入方式主要有两种:一种是使用@Value注解,另一种是使用@ConfigurationProperties注解。后者是Spring Boot从外界接收属性配置的主要方式。除了外部属性文件,还需要了解属性的其他来源。具体教学内容如表2所示:

(3) 条件化创建Bean-使用@Conditional注解

这部分在前面案例的基础上,完成案例“晴天坐公交车上班,雨天开小汽车上班”。展示如何创建条件类,以及在配置类和方法上使用@Conditional注解,在条件满足时创建Bean。

(4) 使用@Profile注解

这部分在@Conditional注解案例的基础上改造,使用@Profile注解来指示某个配置类或者@Bean在哪些Profile下被激活,以及常用的激活Profile的方式。最后展示@Profile和ProfileCondition类的源码,让学生理解@Profile是一种预制的Condition类。

4.2 Spring Boot入门

这部分内容介绍Spring Boot项目的基本代码结构,常用注解和运行方式。重点介绍了自动化配置是如何实现的,并模拟Spring JDBC写一个包含自动化配置的Starter,并将其作为依赖加入Spring Boot案例中使用。学习内容和设计如下:

(1) Spring Boot入门

这是第一个Spring Boot例子,展示一个Spring MVC小案例,编写一个简单的控制器类,在页面上展示一行文字。学生将体会到搭建和运行一个基于Spring Boot的web应用比之前SSM课程中学习的Spring MVC框架简单很多。除此之外还会介绍热启动的配置方法,以及其他运行Spring Boot应用的方法。具体教学内容如表3所示:

(2) Spring Boot的起步依赖和自动配置

这部分为提供给学生的阅读材料,包含使用spring-boot-starter-parent作为parent的作用。如何选择和使用起步依赖,如何覆盖起步依赖引入的传递依赖的版本号。如何排除引入的依赖,并加入其他依赖。最后分析第一个Spring MVC案例,如果使用传统的XML配置方法,需要配置哪些Bean,而Spring Boot自动化配置做了什么。

(3) Spring Boot核心注解和配置

这部分主要介绍Spring Boot中的基本注解和配置。将之前“通过Java方式注册和装配Bean”中的案例移植到Spring Boot框架中,和Spring MVC小案例整合在一起。还要学习在Spring Boot中使用针对profile的属性文件。学习的主要内容如表4所示:

(4) 自动配置原理--写一个Starter

这部分模拟Spring JDBC中的DataSource,JdbcTemplate,并让Spring Boot应用启动时自动创建Bean。模拟的两个Bean创建条件如下:

①DataSource创建条件:当容器中没有DataSource Bean的时候创建,从属性文件中获得连接数据库的4项属性,设置到DataSource对象上。用户必须从外部提供url的值,如果不提供url值,不能创建DataSource Bean。

②JdbcTemplate创建条件:当容器中没有JdbcTemplate Bean,并且容器中存在1个且只有1个DataSource Bean时创建。

在之前的Spring MVC小案例中加入自定义的starter依赖,在application.properties文件中提供数据库连接的4项属性,测试和观察两个Bean的创建。此案例可以学习到Spring Boot如何加载自动配置类,从中获得Bean的信息,将要求的Bean建出来(在条件符合的前提下)。

4.3 Spring Boot和数据库

这部分的学习目标是学习Spring Boot为数据库访问做了哪些自动化的配置。学习如何通过属性文件进行数据库相关的配置。最后学习Spring Boot整合Mybatis的方法。

(1) Spring Boot数据源配置

这部分将使用过去SSM课程中使用的转账案例代码,但将XML方式的Bean配置改写成在配置类中使用@Bean注解,通过方法返回datasource、JdbcTemplat和TransactionManager Bean。

案例测试成功后,再将其转换成一个Spring Boot应用,删除之前的配置,在application.properties配置数据源的几项属性。从这个过程中学生即能学习到Spring Boot对数据库访问进行了哪些自动配置。最后还要学习Spring Boot的默认数据源,以及如何更换和配置其他数据源。

(2) Java方式配置下的Mybatis和Spring整合

这部分也使用过去SSM课程中使用过的转账案例代码(基于Mybatis的),但也采用Java方式进行配置。通过此过程了解Spring整合Mybatis的不同方法和其中涉及的Bean。了解全部整合过程后,对Spring Boot自动化配置了Mybatis的哪些Bean就很清楚了。

(3) Spring Boot整合Mybatis

将前面的Mybatis案例移植到Spring Boot框架下,删除基于Java的配置代码,因为Spring Boot将会把所需的Bean都建出来。最后介绍如何在application.properties中进行Mybatis配置,例如配置别名、驼峰映射等。

4.4 Spring Boot和Web

这部分学习Spring Boot对MVC的支持。包含下面学习内容。

(1) Java方式配置下的Spring MVC入门

案例是包含一个控制器类和一个业务类的Spring MVC应用,使用两种Java方式实现DispatcherServlet的配置。一种是实现WebApplicationInitializer接口,第二种是继承AbstractAnnotationConfigDispatcherServletInitializer类[5]。

(2) Java方式配置下的Spring MVC配置

为了支持对Spring MVC的配置,Spring提供了WebMvcConfigurer接口,只需要实现此接口,重写需要的方法就可以对Spring MVC进行配置。这部分学习下面几项配置:

①处理静态资源,让DispatcherServlet将对静态资源的请求转发到Servlet容器中默认的Servlet上。

②使用Java方式注册InternalResourceViewResolver Bean。

③静态资源映射的配置,使用addResourceHandlers将实际的资源地址映射到一个对外暴露的虚拟路径上。

④添加ViewController,在无业务逻辑的情况下,快速跳转到视图。

⑤拦截器配置。

(3) 自动配置下的Spring MVC

将前面基于Java配置MVC的案例移植到Spring Boot框架下,学习Spring Boot为Spring MVC做了哪些自动配置。主要包括Spring Boot开启了哪些静态资源映射,如何配置欢迎页面等。在application.properties文件中如何配置服务器端口号、contextPath、视图相关配置。通过此过程学生会体会到,由于Spring Boot对MVC进行了大量的自动配置,包括DispatcherServlet等Bean都配置好了,所以开发人员只需关注代码本身的逻辑,额外的配置很少。

(4) 部署到本地Tomcat

上一步使用的是嵌入式的Tomcat来运行web应用,这部分学习如何将Spring Boot的Web应用部署到本地Tomcat运行。

4.5 整合案例开发

在系统学习了Spring Boot框架之后,会让学生开发一个Spring Boot完整案例,案例包含商品展示和评论功能。让學生体验Spring Boot应用搭建和开发的全过程。

5 结束语

有一种说法“对Spring Boot的理解有多深,取决于对Spring框架有多了解”。学习Spring Boot之路甚至就是重学Spring之路,本课程的设计也遵循了这一理念。该课程已经实施了两年,从教学效果和学生反馈来看,由于配置的简化,业务实现代码没有大变化,学生觉得开发本身的难度不大,但是理解自动化配置的实现方式上有困难。特别是从XML方式的配置转换到基于Java的配置,需要一个适应过程。这门课以后还将继续完善优化,期待有更好的教学效果。

参考文献:

[1] 黑马程序员.Java EE企业级应用开发教程Spring+Spring MVC+MyBatis[M].北京:人民邮电出版社,2017.

[2] 小马哥.Spring Boot编程思想[M].北京:电子工业出版社,2019.

[3] 克雷格·沃斯.Spring Boot实战[M].丁雪丰译.北京:人民邮电出版社,2016.

[4] 汪云飞.Java EE开发的颠覆者Spring Boot实战[M].北京:电子工业出版社,2016.

[5] Craig Walls.Spring实战(第4版)[M].张卫滨,译.北京:人民邮电出版社,2016.

【通联编辑:王力】

收稿日期:2021-12-23

作者简介:王崟(1981—),女,江苏南京人,讲师,硕士,主要研究方向为软件技术;陆莉莉(1978—) ,女,江苏南通人,副教授,硕士,主要研究方向为大数据。