王崟 陸莉莉



摘要: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—) ,女,江蘇南通人,副教授,碩士,主要研究方向為大數據。