王崟 陸莉莉
摘要:SSM框架和Spring Boot框架是近些年主流的Java企業(yè)級(jí)應(yīng)用框架。文本分析了兩種框架的關(guān)系以及差異,給出了在具備SSM基礎(chǔ)的前提下,Spring Boot課程的教學(xué)重點(diǎn)分析。最后詳細(xì)介紹了Spring Boot課程的教學(xué)內(nèi)容組織和實(shí)施過(guò)程。
關(guān)鍵詞:SSM;Spring Boot;教學(xué)內(nèi)容設(shè)計(jì)
中圖分類(lèi)號(hào):G642? ? ? ? 文獻(xiàn)標(biāo)識(shí)碼:A
文章編號(hào):1009-3044(2022)26-0163-04
1 引言
SSM(Spring+SpringMVC+MyBatis)框架是近些年常見(jiàn)的Java企業(yè)級(jí)應(yīng)用開(kāi)發(fā)的框架,它能使項(xiàng)目具有高度的可維護(hù)性和擴(kuò)展性[1]。而傳統(tǒng)SSM框架繁重的配置以及集成第三方技術(shù)難度大等缺點(diǎn)使得Spring Boot框架產(chǎn)生了。一些軟件技術(shù)專(zhuān)業(yè)除了開(kāi)設(shè)基本的Java Web課程之外,也會(huì)開(kāi)設(shè)這些框架課程。本人所在專(zhuān)業(yè)先開(kāi)設(shè)SSM課程,然后再以?xún)芍軐?shí)訓(xùn)形式開(kāi)設(shè)Spring Boot課程。本人通過(guò)教學(xué)經(jīng)驗(yàn),淺談在具備SSM基礎(chǔ)的前提下,如何開(kāi)展Spring Boot教學(xué)。詳細(xì)介紹了課程的教學(xué)內(nèi)容設(shè)計(jì),特別是與SSM課程的銜接。
2 SSM和Spring Boot框架的關(guān)系以及開(kāi)發(fā)中的差異
2.1 SSM和Spring Boot框架的關(guān)系
Spring Boot是Spring家族的一個(gè)子項(xiàng)目,它的設(shè)計(jì)目的是用來(lái)簡(jiǎn)化基于Spring的應(yīng)用的搭建以及開(kāi)發(fā)過(guò)程。Spring Boot框架可以看成一個(gè)“自動(dòng)化”配置的框架,它讓構(gòu)建獨(dú)立的Spring生產(chǎn)級(jí)別應(yīng)用變得簡(jiǎn)單,它可以對(duì)Bean進(jìn)行自動(dòng)化的配置[2]。配置簡(jiǎn)化之后,開(kāi)發(fā)人員能更專(zhuān)注于應(yīng)用程序功能,不用在配置上花太多功夫。如果在Spring Boot框架下開(kāi)發(fā)基于Spring MVC和Mybatis的應(yīng)用,從控制器代碼到持久層代碼的編寫(xiě)上并無(wú)明顯區(qū)別。
2.2 從SSM到Spring Boot開(kāi)發(fā)上的差異
根據(jù)上面介紹的兩種框架之間的關(guān)系,在從SSM進(jìn)階到Spring Boot的過(guò)程中,兩者開(kāi)發(fā)上的差別如下:
(1) 依賴(lài)管理的差別
在使用SSM框架的時(shí)候需要加入很多不同的第三方依賴(lài),還得自行調(diào)配依賴(lài)的版本。一個(gè)SSM項(xiàng)目可能需要在POM中添加十幾個(gè)甚至更多的依賴(lài)。
而Spring Boot通過(guò)提供眾多起步依賴(lài)來(lái)降低項(xiàng)目依賴(lài)的復(fù)雜度,起步依賴(lài)名字中都含有“starter”。起步依賴(lài)本質(zhì)上是一個(gè)POM,定義了對(duì)其他庫(kù)的傳遞依賴(lài),這些依賴(lài)組合起來(lái),即可支持某項(xiàng)功能[3]。這樣開(kāi)發(fā)的時(shí)候只需要加入少量的starter依賴(lài)即可進(jìn)行某種特定類(lèi)型的應(yīng)用開(kāi)發(fā)。例如:做基本的Spring開(kāi)發(fā),只要加入spring-boot-starter,就會(huì)把Spring的基本依賴(lài)都傳遞進(jìn)來(lái)。如果要做Web開(kāi)發(fā),只要加入spring-boot-starter-web依賴(lài)。開(kāi)發(fā)者不需要再考慮具體需要哪些Jar包,引入相關(guān)起步依賴(lài)就行了。
除此之外,起步依賴(lài)中各個(gè)依賴(lài)版本之間的兼容性都經(jīng)過(guò)了精心的測(cè)試,基本不用擔(dān)心沖突。此外Spring Boot利用Maven的依賴(lài)管理功能,繼承了很多常用庫(kù)的依賴(lài)版本,添加依賴(lài)時(shí)就可以不用指定版本號(hào)。
(2) 配置的差別
在SSM框架中往往使用XML方式配置和裝配第三方Bean,因此項(xiàng)目中會(huì)存在大量配置文件來(lái)配置第三方Bean。而通過(guò)Java方式注冊(cè)和裝配Bean是Spring Boot推薦的配置方式,其可以根據(jù)依賴(lài)自動(dòng)創(chuàng)建、配置和裝配Bean,開(kāi)發(fā)者只需要寫(xiě)少量必需的配置即可。配置方式也從XML格式的Spring配置文件轉(zhuǎn)變?yōu)閜roperties屬性文件或者yml文件。
3 從SSM進(jìn)階到Spring Boot框架的教學(xué)重點(diǎn)分析
由于Spring Boot框架和SSM框架的重點(diǎn)差異在于“自動(dòng)化”配置,而不在于應(yīng)用程序代碼本身。學(xué)生已經(jīng)學(xué)過(guò)了SSM課程,對(duì)于這三個(gè)框架的基本使用已經(jīng)無(wú)須再重復(fù)學(xué)習(xí),學(xué)習(xí)的重點(diǎn)就落在了如何讓學(xué)生理解“自動(dòng)化”配置是如何實(shí)現(xiàn)的,以及如何將一個(gè)SSM應(yīng)用轉(zhuǎn)換成基于Spring Boot的應(yīng)用。Spring Boot教學(xué)重點(diǎn)分析如下:
3.1 強(qiáng)化“自動(dòng)化”配置實(shí)現(xiàn)的基礎(chǔ)
Spring Boot自動(dòng)化配置的基本思路就是根據(jù)特定條件來(lái)控制Bean的創(chuàng)建。因此通過(guò)Java方式注冊(cè)和裝配Bean是Spring Boot實(shí)現(xiàn)自動(dòng)化配置的基石之一,結(jié)合@Conditional條件注解,便可以通過(guò)代碼來(lái)控制Bean的創(chuàng)建,這是使用XML配置Bean做不到的。此外由于Spring Boot將使用外部屬性文件來(lái)進(jìn)行配置,所以必須理解外部屬性注入Bean的幾種方式。
3.2 學(xué)習(xí)使用起步依賴(lài)
在開(kāi)發(fā)Spring Boot項(xiàng)目時(shí),在POM中繼承spring-boot-starter-parent。此外也不需要再添加獨(dú)立的單個(gè)依賴(lài),直接添加Spring Boot相應(yīng)的起步依賴(lài)就行了。學(xué)生必須學(xué)習(xí)如何選擇和添加需要的起步依賴(lài)。除了直接使用起步依賴(lài),還要學(xué)會(huì)如何覆蓋起步依賴(lài)引入的傳遞依賴(lài)。例如Spring Boot默認(rèn)使用內(nèi)置Tomcat,如果想使用Jetty,可以把starter-tomcat排除,添加starter-jetty。如果打算部署到本地Tomcat,不使用內(nèi)置服務(wù)器,可以直接排除starter-tomcat。如果添加的起步依賴(lài)中包含的某個(gè)傳遞依賴(lài)的版本不合適,可以將其排除,再添加一個(gè)合適版本的依賴(lài)。
3.3 學(xué)習(xí)寫(xiě)自己的Starter
為了能更好地理解自動(dòng)化配置,應(yīng)該學(xué)習(xí)寫(xiě)一個(gè)包含自動(dòng)化配置的Starter,模仿Spring Boot的自動(dòng)配置,并將自己寫(xiě)的Starter依賴(lài)加入某個(gè)Spring Boot項(xiàng)目中,觀察其如何根據(jù)條件在啟動(dòng)過(guò)程中創(chuàng)建Bean[4]。
3.4 將SSM傳統(tǒng)案例改造成基于Java方式注冊(cè)和裝配Bean
SSM課的傳統(tǒng)案例均是使用XML方式來(lái)配置和裝配第三方Bean。在學(xué)習(xí)Spring Boot的時(shí)候可以將其改造成基于Java方式注冊(cè)和裝配Bean。通過(guò)這種方式可以很清楚地看出進(jìn)行某方面開(kāi)發(fā)時(shí),需要哪些最基本的Bean及它們之間的關(guān)聯(lián),以及這些Bean如何被創(chuàng)建出來(lái),需要用戶提供哪些配置屬性。之后再引入Spring Boot自動(dòng)配置和外部屬性,刪除自定義的Java配置類(lèi),便能明白Spring Boot做了哪些自動(dòng)配置。
4 Spring Boot課程教學(xué)內(nèi)容和實(shí)施過(guò)程
實(shí)際教學(xué)中,Spring Boot課程以?xún)芍軐?shí)訓(xùn)的形式安排在SSM課程結(jié)束之后。Spring Boot學(xué)習(xí)和開(kāi)發(fā)內(nèi)容如下:
4.1 通過(guò)Java方式注冊(cè)和裝配Bean
在此階段并不使用Spring Boot的自動(dòng)配置,但為了和之后的Spring Boot依賴(lài)接軌,直接加入Spring Boot的起步依賴(lài),而不是單獨(dú)加入Spring依賴(lài)。這部分內(nèi)容以文檔和小項(xiàng)目形式教授下面內(nèi)容:
(1) 通過(guò)Java方式注冊(cè)和裝配Bean
使用一個(gè)案例進(jìn)行幾個(gè)Bean的創(chuàng)建和裝配,學(xué)習(xí)@Configuration和@Bean注解的使用,多個(gè)配置類(lèi)的組合使用,使用@ComponentScan注解掃描包來(lái)發(fā)現(xiàn)配置類(lèi)。具體教學(xué)內(nèi)容如表1所示:
(2) 從屬性文件注入值
由于Spring Boot將使用外部屬性文件來(lái)進(jìn)行配置,為了理解這些外部屬性如何用來(lái)配置Bean,需要學(xué)習(xí)引入外部屬性文件,并將屬性值注入Bean。注入方式主要有兩種:一種是使用@Value注解,另一種是使用@ConfigurationProperties注解。后者是Spring Boot從外界接收屬性配置的主要方式。除了外部屬性文件,還需要了解屬性的其他來(lái)源。具體教學(xué)內(nèi)容如表2所示:
(3) 條件化創(chuàng)建Bean-使用@Conditional注解
這部分在前面案例的基礎(chǔ)上,完成案例“晴天坐公交車(chē)上班,雨天開(kāi)小汽車(chē)上班”。展示如何創(chuàng)建條件類(lèi),以及在配置類(lèi)和方法上使用@Conditional注解,在條件滿足時(shí)創(chuàng)建Bean。
(4) 使用@Profile注解
這部分在@Conditional注解案例的基礎(chǔ)上改造,使用@Profile注解來(lái)指示某個(gè)配置類(lèi)或者@Bean在哪些Profile下被激活,以及常用的激活Profile的方式。最后展示@Profile和ProfileCondition類(lèi)的源碼,讓學(xué)生理解@Profile是一種預(yù)制的Condition類(lèi)。
4.2 Spring Boot入門(mén)
這部分內(nèi)容介紹Spring Boot項(xiàng)目的基本代碼結(jié)構(gòu),常用注解和運(yùn)行方式。重點(diǎn)介紹了自動(dòng)化配置是如何實(shí)現(xiàn)的,并模擬Spring JDBC寫(xiě)一個(gè)包含自動(dòng)化配置的Starter,并將其作為依賴(lài)加入Spring Boot案例中使用。學(xué)習(xí)內(nèi)容和設(shè)計(jì)如下:
(1) Spring Boot入門(mén)
這是第一個(gè)Spring Boot例子,展示一個(gè)Spring MVC小案例,編寫(xiě)一個(gè)簡(jiǎn)單的控制器類(lèi),在頁(yè)面上展示一行文字。學(xué)生將體會(huì)到搭建和運(yùn)行一個(gè)基于Spring Boot的web應(yīng)用比之前SSM課程中學(xué)習(xí)的Spring MVC框架簡(jiǎn)單很多。除此之外還會(huì)介紹熱啟動(dòng)的配置方法,以及其他運(yùn)行Spring Boot應(yīng)用的方法。具體教學(xué)內(nèi)容如表3所示:
(2) Spring Boot的起步依賴(lài)和自動(dòng)配置
這部分為提供給學(xué)生的閱讀材料,包含使用spring-boot-starter-parent作為parent的作用。如何選擇和使用起步依賴(lài),如何覆蓋起步依賴(lài)引入的傳遞依賴(lài)的版本號(hào)。如何排除引入的依賴(lài),并加入其他依賴(lài)。最后分析第一個(gè)Spring MVC案例,如果使用傳統(tǒng)的XML配置方法,需要配置哪些Bean,而Spring Boot自動(dòng)化配置做了什么。
(3) Spring Boot核心注解和配置
這部分主要介紹Spring Boot中的基本注解和配置。將之前“通過(guò)Java方式注冊(cè)和裝配Bean”中的案例移植到Spring Boot框架中,和Spring MVC小案例整合在一起。還要學(xué)習(xí)在Spring Boot中使用針對(duì)profile的屬性文件。學(xué)習(xí)的主要內(nèi)容如表4所示:
(4) 自動(dòng)配置原理--寫(xiě)一個(gè)Starter
這部分模擬Spring JDBC中的DataSource,JdbcTemplate,并讓Spring Boot應(yīng)用啟動(dòng)時(shí)自動(dòng)創(chuàng)建Bean。模擬的兩個(gè)Bean創(chuàng)建條件如下:
①DataSource創(chuàng)建條件:當(dāng)容器中沒(méi)有DataSource Bean的時(shí)候創(chuàng)建,從屬性文件中獲得連接數(shù)據(jù)庫(kù)的4項(xiàng)屬性,設(shè)置到DataSource對(duì)象上。用戶必須從外部提供url的值,如果不提供url值,不能創(chuàng)建DataSource Bean。
②JdbcTemplate創(chuàng)建條件:當(dāng)容器中沒(méi)有JdbcTemplate Bean,并且容器中存在1個(gè)且只有1個(gè)DataSource Bean時(shí)創(chuàng)建。
在之前的Spring MVC小案例中加入自定義的starter依賴(lài),在application.properties文件中提供數(shù)據(jù)庫(kù)連接的4項(xiàng)屬性,測(cè)試和觀察兩個(gè)Bean的創(chuàng)建。此案例可以學(xué)習(xí)到Spring Boot如何加載自動(dòng)配置類(lèi),從中獲得Bean的信息,將要求的Bean建出來(lái)(在條件符合的前提下)。
4.3 Spring Boot和數(shù)據(jù)庫(kù)
這部分的學(xué)習(xí)目標(biāo)是學(xué)習(xí)Spring Boot為數(shù)據(jù)庫(kù)訪問(wèn)做了哪些自動(dòng)化的配置。學(xué)習(xí)如何通過(guò)屬性文件進(jìn)行數(shù)據(jù)庫(kù)相關(guān)的配置。最后學(xué)習(xí)Spring Boot整合Mybatis的方法。
(1) Spring Boot數(shù)據(jù)源配置
這部分將使用過(guò)去SSM課程中使用的轉(zhuǎn)賬案例代碼,但將XML方式的Bean配置改寫(xiě)成在配置類(lèi)中使用@Bean注解,通過(guò)方法返回datasource、JdbcTemplat和TransactionManager Bean。
案例測(cè)試成功后,再將其轉(zhuǎn)換成一個(gè)Spring Boot應(yīng)用,刪除之前的配置,在application.properties配置數(shù)據(jù)源的幾項(xiàng)屬性。從這個(gè)過(guò)程中學(xué)生即能學(xué)習(xí)到Spring Boot對(duì)數(shù)據(jù)庫(kù)訪問(wèn)進(jìn)行了哪些自動(dòng)配置。最后還要學(xué)習(xí)Spring Boot的默認(rèn)數(shù)據(jù)源,以及如何更換和配置其他數(shù)據(jù)源。
(2) Java方式配置下的Mybatis和Spring整合
這部分也使用過(guò)去SSM課程中使用過(guò)的轉(zhuǎn)賬案例代碼(基于Mybatis的),但也采用Java方式進(jìn)行配置。通過(guò)此過(guò)程了解Spring整合Mybatis的不同方法和其中涉及的Bean。了解全部整合過(guò)程后,對(duì)Spring Boot自動(dòng)化配置了Mybatis的哪些Bean就很清楚了。
(3) Spring Boot整合Mybatis
將前面的Mybatis案例移植到Spring Boot框架下,刪除基于Java的配置代碼,因?yàn)镾pring Boot將會(huì)把所需的Bean都建出來(lái)。最后介紹如何在application.properties中進(jìn)行Mybatis配置,例如配置別名、駝峰映射等。
4.4 Spring Boot和Web
這部分學(xué)習(xí)Spring Boot對(duì)MVC的支持。包含下面學(xué)習(xí)內(nèi)容。
(1) Java方式配置下的Spring MVC入門(mén)
案例是包含一個(gè)控制器類(lèi)和一個(gè)業(yè)務(wù)類(lèi)的Spring MVC應(yīng)用,使用兩種Java方式實(shí)現(xiàn)DispatcherServlet的配置。一種是實(shí)現(xiàn)WebApplicationInitializer接口,第二種是繼承AbstractAnnotationConfigDispatcherServletInitializer類(lèi)[5]。
(2) Java方式配置下的Spring MVC配置
為了支持對(duì)Spring MVC的配置,Spring提供了WebMvcConfigurer接口,只需要實(shí)現(xiàn)此接口,重寫(xiě)需要的方法就可以對(duì)Spring MVC進(jìn)行配置。這部分學(xué)習(xí)下面幾項(xiàng)配置:
①處理靜態(tài)資源,讓DispatcherServlet將對(duì)靜態(tài)資源的請(qǐng)求轉(zhuǎn)發(fā)到Servlet容器中默認(rèn)的Servlet上。
②使用Java方式注冊(cè)InternalResourceViewResolver Bean。
③靜態(tài)資源映射的配置,使用addResourceHandlers將實(shí)際的資源地址映射到一個(gè)對(duì)外暴露的虛擬路徑上。
④添加ViewController,在無(wú)業(yè)務(wù)邏輯的情況下,快速跳轉(zhuǎn)到視圖。
⑤攔截器配置。
(3) 自動(dòng)配置下的Spring MVC
將前面基于Java配置MVC的案例移植到Spring Boot框架下,學(xué)習(xí)Spring Boot為Spring MVC做了哪些自動(dòng)配置。主要包括Spring Boot開(kāi)啟了哪些靜態(tài)資源映射,如何配置歡迎頁(yè)面等。在application.properties文件中如何配置服務(wù)器端口號(hào)、contextPath、視圖相關(guān)配置。通過(guò)此過(guò)程學(xué)生會(huì)體會(huì)到,由于Spring Boot對(duì)MVC進(jìn)行了大量的自動(dòng)配置,包括DispatcherServlet等Bean都配置好了,所以開(kāi)發(fā)人員只需關(guān)注代碼本身的邏輯,額外的配置很少。
(4) 部署到本地Tomcat
上一步使用的是嵌入式的Tomcat來(lái)運(yùn)行web應(yīng)用,這部分學(xué)習(xí)如何將Spring Boot的Web應(yīng)用部署到本地Tomcat運(yùn)行。
4.5 整合案例開(kāi)發(fā)
在系統(tǒng)學(xué)習(xí)了Spring Boot框架之后,會(huì)讓學(xué)生開(kāi)發(fā)一個(gè)Spring Boot完整案例,案例包含商品展示和評(píng)論功能。讓學(xué)生體驗(yàn)Spring Boot應(yīng)用搭建和開(kāi)發(fā)的全過(guò)程。
5 結(jié)束語(yǔ)
有一種說(shuō)法“對(duì)Spring Boot的理解有多深,取決于對(duì)Spring框架有多了解”。學(xué)習(xí)Spring Boot之路甚至就是重學(xué)Spring之路,本課程的設(shè)計(jì)也遵循了這一理念。該課程已經(jīng)實(shí)施了兩年,從教學(xué)效果和學(xué)生反饋來(lái)看,由于配置的簡(jiǎn)化,業(yè)務(wù)實(shí)現(xiàn)代碼沒(méi)有大變化,學(xué)生覺(jué)得開(kāi)發(fā)本身的難度不大,但是理解自動(dòng)化配置的實(shí)現(xiàn)方式上有困難。特別是從XML方式的配置轉(zhuǎn)換到基于Java的配置,需要一個(gè)適應(yīng)過(guò)程。這門(mén)課以后還將繼續(xù)完善優(yōu)化,期待有更好的教學(xué)效果。
參考文獻(xiàn):
[1] 黑馬程序員.Java EE企業(yè)級(jí)應(yīng)用開(kāi)發(fā)教程Spring+Spring MVC+MyBatis[M].北京:人民郵電出版社,2017.
[2] 小馬哥.Spring Boot編程思想[M].北京:電子工業(yè)出版社,2019.
[3] 克雷格·沃斯.Spring Boot實(shí)戰(zhàn)[M].丁雪豐譯.北京:人民郵電出版社,2016.
[4] 汪云飛.Java EE開(kāi)發(fā)的顛覆者Spring Boot實(shí)戰(zhàn)[M].北京:電子工業(yè)出版社,2016.
[5] Craig Walls.Spring實(shí)戰(zhàn)(第4版)[M].張衛(wèi)濱,譯.北京:人民郵電出版社,2016.
【通聯(lián)編輯:王力】
收稿日期:2021-12-23
作者簡(jiǎn)介:王崟(1981—),女,江蘇南京人,講師,碩士,主要研究方向?yàn)檐浖夹g(shù);陸莉莉(1978—) ,女,江蘇南通人,副教授,碩士,主要研究方向?yàn)榇髷?shù)據(jù)。