于 昕,廖晨伶,周衛(wèi)麗
(1.長春大學(xué) 特殊教育研究中心,吉林 長春 13002;2.長春理工大學(xué) 計(jì)算機(jī)科學(xué)技術(shù)學(xué)院,吉林 長春 130022)
MVC模式分為模型(Model)、視圖(View)和控制器(Controller)3個部分,能實(shí)現(xiàn)一種動態(tài)、可擴(kuò)展的程序設(shè)計(jì),當(dāng)人們有其他需求時能做到對程序進(jìn)行修改以及擴(kuò)展簡化,并對程序的功能重復(fù)利用[1].但是該模型在系統(tǒng)結(jié)構(gòu)和實(shí)現(xiàn)兩方面都具有較大的復(fù)雜度.因此并不適用于中小型應(yīng)用程序,如果想要改造這些工具來適應(yīng)MVC模式,就需要建立分離的部件,這增加了使用MVC架構(gòu)的難度[2].Spring Boot 是一個微服務(wù)的框架,使用項(xiàng)目中存在著的大量的常用配置以及內(nèi)置的一個習(xí)慣性的配置(即各種約定),可以在項(xiàng)目啟動時直接加載而不必單獨(dú)配置(即約定大于配置),讓項(xiàng)目快速地運(yùn)行起來.由于傳統(tǒng)的MVC設(shè)計(jì)模式使用Java開發(fā)的Web應(yīng)用程序顯得格外笨重并且每個項(xiàng)目都需要重新配置,因此Spring boot的到來在一定程度上解決了上述相關(guān)問題,微服務(wù)感覺像是架構(gòu)中的組合模式,把能獨(dú)立的業(yè)務(wù)模塊分離出來單獨(dú)部署,實(shí)現(xiàn)開發(fā)、維護(hù)上的分離,避免整體升級帶來的麻煩[3].本課題研究的目的在于如何保持和延續(xù)MVC架構(gòu)優(yōu)點(diǎn)的同時,完善它的局限性.
通過Spring boot框架重構(gòu)MVC設(shè)計(jì)模式開發(fā)的應(yīng)用程序.代碼重構(gòu)之后會使應(yīng)用程序變得有層次、有條理.但多數(shù)情況下,開發(fā)項(xiàng)目的時間比較少時,不建議對數(shù)據(jù)進(jìn)行重構(gòu)操作,因?yàn)橹貥?gòu)要花費(fèi)大量的人力和時間.在處理數(shù)據(jù)庫的業(yè)務(wù)邏輯時,不使用數(shù)據(jù)庫的語句,簡化數(shù)據(jù)庫語句的相關(guān)操作,一個類對應(yīng)一個表,使表中字段與類的成員變量對應(yīng)起來,不用關(guān)心類實(shí)例怎么和數(shù)據(jù)庫數(shù)據(jù)進(jìn)行交互.根據(jù)情況執(zhí)行生成的數(shù)據(jù)庫語句,自動處理返回對象的結(jié)果,還可以返回開發(fā)人員想要的形式.建立一個數(shù)據(jù)的對象模型,并把數(shù)據(jù)庫的表和字段與模型相對應(yīng),把數(shù)據(jù)庫交互形成的代碼進(jìn)行修改.
關(guān)于MVC設(shè)計(jì)模式,比較熟悉和使用較多的是Spring+SpringMVC+Mybatis(簡稱SSM框架).SSM需要進(jìn)行大量配置,引用依賴包、數(shù)據(jù)庫驅(qū)動包、服務(wù)器jar包、核心容器依賴包等.項(xiàng)目中大量文件的編寫不僅使項(xiàng)目的運(yùn)行變慢,過分的框架整合配置、繁瑣的代碼編寫更是會導(dǎo)致效率的大幅度降低.而Spring boot框架中則集成了大量開箱即用的第三方庫配置,也就是所說的各種“約定”,這樣使開發(fā)人員能夠更加專注于業(yè)務(wù)邏輯設(shè)計(jì),而不必進(jìn)行繁瑣的項(xiàng)目配置,實(shí)現(xiàn)約定大于配置.所以,Spring boot框架的優(yōu)點(diǎn)有如下幾點(diǎn):
1.可以簡化編碼[4];
2.可以簡化配置;
3.可以簡化部署,簡化了tomcat服務(wù)器的相關(guān)文件的配置部署;
4.可以簡化監(jiān)控,直接使用REST 方式來獲取進(jìn)程的運(yùn)行期性能參數(shù).
(1)某項(xiàng)目都有出現(xiàn)在三種度量結(jié)果的前十名,但在各方法中具體排名不同.以bootstrap為例:從用戶興趣的角度對項(xiàng)目進(jìn)行排名,bootstrap排名第二,如圖3中(b)所示;從開發(fā)參與的角度進(jìn)行排名,bootstrap排名第三,如圖3中(c)所示;本文所提方法由于綜合了用戶興趣和開發(fā)參與等因素,避免了單一因素的片面性,其項(xiàng)目排名為第一,體現(xiàn)了bootstrap項(xiàng)目在用戶興趣和開發(fā)參與等方面的綜合成功.
綜上所述,它和SSM結(jié)構(gòu)上差不多,只是在SSM基礎(chǔ)上省略了配置文件,加快項(xiàng)目的啟動,還內(nèi)置了tomcat服務(wù)器,省略了服務(wù)器的配置工作[5].
Spring boot框架的核心原理是基于SpringMVC無配置文件、(純Java)完全注解化+內(nèi)置tomcat實(shí)現(xiàn)SpringBoot框架、Main函數(shù)啟動,SpringBoot核心快速整合第三方框架原理:Maven繼承依賴關(guān)系,SpringBoot內(nèi)嵌入tomcat,SpringBoot采用SpringMVC注解版本實(shí)現(xiàn)無配置效果[4].Spring boot框架的性能優(yōu)化:掃描包文件進(jìn)行優(yōu)化,通過使用@SpringBootApplication注解自動獲取服務(wù)器配置、數(shù)據(jù)庫配置信息,由有效的自動配置(auto-configuration)和相關(guān)組件的掃描(component scanning)組成,這跟使用@Configuration、@EnableAutoConfiguration和@ComponentScan3個注解的作用是一樣的.這樣做給開發(fā)帶來方便的同時,也會造成項(xiàng)目啟動時間過長降低運(yùn)行的效率、加載出多余不需要的內(nèi)容、cpu的消耗過大3方面的影響.針對以上情況,我們可以在項(xiàng)目中對@SpringBootApplication注解進(jìn)行刪除,然后使用@ComponentScan注解來掃描特定的包.內(nèi)置tomcat服務(wù)器 直接利用Java語言創(chuàng)建tomcat服務(wù)器運(yùn)行.添加依賴; 創(chuàng)建servlet; 創(chuàng)建tomcat啟動程序; 以上內(nèi)容是對Spring boot框架性能部分的優(yōu)化操作,所造成的性能方面的問題和它擁有的優(yōu)點(diǎn)不相沖突.
本文案例使用的是Mysql數(shù)據(jù)庫[6].實(shí)際應(yīng)用案例OA辦公管理系統(tǒng)對應(yīng)的數(shù)據(jù)庫有如下表:
1.員工信息oa_user表;
2.日程安排oa_schedule表;
3.郵件信息oa_email表;
4.公告信息oa_notice表;
6.部門信息oa_dept表.
數(shù)據(jù)庫表設(shè)計(jì)是OA辦公管理系統(tǒng)中用到的所有表,從系統(tǒng)的性能和可維護(hù)性考慮,所有表的設(shè)計(jì)都滿足數(shù)據(jù)庫設(shè)計(jì)的三范式,并合理設(shè)計(jì)了相關(guān)表的外鍵聯(lián)系,以便后面的多表聯(lián)合查詢操作.數(shù)據(jù)庫的設(shè)計(jì)中適當(dāng)?shù)倪M(jìn)行相關(guān)表的外鍵設(shè)置,可以通過連接查詢的方式快速對數(shù)據(jù)庫的數(shù)據(jù)進(jìn)行相關(guān)查詢,還有對數(shù)據(jù)庫表的結(jié)構(gòu)進(jìn)行了合理的設(shè)置,表中各字段的類型設(shè)置和長度設(shè)置,避免查詢的低效率,保證數(shù)據(jù)庫的穩(wěn)定性.而對數(shù)據(jù)庫連接優(yōu)化操作可以通過數(shù)據(jù)源實(shí)現(xiàn),所有用戶對數(shù)據(jù)庫的連接操作都需要經(jīng)過加載數(shù)據(jù)庫驅(qū)動程序、連接數(shù)據(jù)庫、操作數(shù)據(jù)庫、關(guān)閉數(shù)據(jù)庫釋放連接4個步驟.但只在操作數(shù)據(jù)庫上是不一樣的,所以最好寫一個工具類用來存放所有數(shù)據(jù)庫連接,這樣使用數(shù)據(jù)庫的時候就可以不用重新反復(fù)加載數(shù)據(jù)庫的驅(qū)動,以及實(shí)現(xiàn)連接數(shù)據(jù)庫之類的操作了.直接在工具類中找到相關(guān)數(shù)據(jù)庫連接就可以,關(guān)閉的時候直接在工具類中把連接關(guān)掉.那么保存所有數(shù)據(jù)庫連接的空間可以稱為連接池,但這個空間用程序?qū)崿F(xiàn)會比較麻煩,所以在tomcat4.1.27之后,在tomcat服務(wù)器上就增加了數(shù)據(jù)源配置的選項(xiàng),這樣直接在服務(wù)器上配置好數(shù)據(jù)源連接池即可[7].具體來說,就是通過實(shí)現(xiàn)org.apache.tomcat.jdbc.pool.DataSource這個數(shù)據(jù)源,并配置application.yml中的datasource為該數(shù)據(jù)源、指定jndi-name為jdbc/datahub方式、數(shù)據(jù)庫名字db為你的數(shù)據(jù)庫,完成Spring boot對JNDI的綁定.系統(tǒng)運(yùn)行過程中,在J2EE服務(wù)器上保存著一個數(shù)據(jù)庫的多個連接,客戶端可以通過名稱找到被綁定在JNDI樹上的DataSource,再由DataSource找到一個連接,那么在以后的操作中,除了數(shù)據(jù)庫的連接方式不一樣之外,其他的所有操作都一樣,只是關(guān)閉的時候不是徹底地關(guān)閉數(shù)據(jù)庫,而是把數(shù)據(jù)庫的連接放回到連接池中去[8].當(dāng)然,數(shù)據(jù)源可以是任何類型的數(shù)據(jù)庫.ORM系統(tǒng)是一組專門為大多數(shù)著名的數(shù)據(jù)庫管理系統(tǒng)構(gòu)建的類.一個主要類為所需數(shù)據(jù)庫管理系統(tǒng)中的一般類型的表提供基本的映射、關(guān)系和管理.關(guān)系應(yīng)該被映射為允許以面向?qū)ο蟮姆绞将@取相關(guān)數(shù)據(jù),而不需要開發(fā)人員編寫復(fù)雜的查詢.應(yīng)該考慮數(shù)據(jù)的急切和懶惰加載.數(shù)據(jù)源提供了大家都可以用的一個模板,數(shù)據(jù)源中存放了數(shù)據(jù)庫的連接信息.數(shù)據(jù)源通過抽象的映射找到對應(yīng)的連接數(shù)據(jù)庫.數(shù)據(jù)源將連接保存在連接池中,掩蓋了底層具體的實(shí)現(xiàn)方法,只提供JDBC驅(qū)動的抽象的一個接口,用來得到相關(guān)數(shù)據(jù)庫的連接,使用數(shù)據(jù)源建立的對象會放在連接池統(tǒng)一進(jìn)行管理.而連接池在JDBC具體實(shí)現(xiàn)上,就是封裝JDBC的接口,這個封裝過程需要配置數(shù)據(jù)庫驅(qū)動包,而且配置的過程中要保證遵循JDBC API的具體實(shí)現(xiàn)類,如果沒有遵循就會報錯.
應(yīng)用于實(shí)際案例,編寫了一個OA辦公管理系統(tǒng),下面對系統(tǒng)的功能以及要求進(jìn)行介紹.
1.系統(tǒng)管理
(1)組織結(jié)構(gòu):該模塊主要管理員工所在部門;
(2)人員管理:該模塊主要管理公司所有人員信息;
(3)公告管理:該模塊主要負(fù)責(zé)展示公司所有的公告信息.
2.個人辦公
(1)個人設(shè)置:可以設(shè)置個人信息,替換修改照片,修改個人登錄密碼,修改工作狀態(tài),其他信息要求只讀;
(2)日程安排:方便個人安排日程,系統(tǒng)管理員可以對所有人安排日程;
(3)待辦事項(xiàng):待辦事項(xiàng)中集中了用戶當(dāng)前需辦理的工作和需處理的事務(wù);
(4)流程審批:可以查看所有審批信息,新建一個流程到完成審批整個階段.可以在未審批或者已駁回階段維護(hù)流程審批數(shù)據(jù).
3.郵件管理
(1)發(fā)件箱:展示已發(fā)送的所有郵件;
(2)收件箱:展示已接收的所有郵件;
4.工資結(jié)算:展示本月工資,展示出員工姓名、部門等信息.
5.統(tǒng)計(jì)管理:各部門離職情況, 上級領(lǐng)導(dǎo)對于各部門審批情況, 個人出差休假在崗比例;
6.登錄功能:要求分權(quán)限登錄.
具體結(jié)構(gòu)如圖1所示,其中的各級功能對應(yīng)數(shù)據(jù)庫中的各個表,完成綁定后即可進(jìn)行數(shù)據(jù)操作,而不必再專門編寫數(shù)據(jù)庫操作代碼.
圖1 系統(tǒng)結(jié)構(gòu)圖
以上信息是對系統(tǒng)的功能方面進(jìn)行敘述,本系統(tǒng)的目的在于節(jié)約溝通成本,提升企業(yè)管理水平、獲得更好的經(jīng)濟(jì)效益[9].
MVC設(shè)計(jì)模式在設(shè)計(jì)過程中的大量配置文件,以及對服務(wù)器進(jìn)行相關(guān)信息的配置,都會造成項(xiàng)目的啟動效率下降[10].Spring boot框架內(nèi)置了服務(wù)器,省略了配置文件,加快項(xiàng)目啟動,使對應(yīng)的性能、效率和靈活性得到了相應(yīng)的提升[11].分別對SSM框架和Spring boot框架的應(yīng)用程序進(jìn)行啟動測試,得出數(shù)據(jù)如表1所示.
表1 啟動時間對比
通過以上數(shù)據(jù)可以看到,Spring boot的啟動時間大約是SSM的一半.在傳統(tǒng) WEB 項(xiàng)目中,項(xiàng)目的啟動一般是從 web.xml 配置文件的載入開始,SSM的啟動過程實(shí)際上就是 Ioc 容器初始化以及載入 Bean 的過程,并在適當(dāng)?shù)臅r候創(chuàng)建Servlet節(jié)點(diǎn)實(shí)例,而SpringBoot 則回歸了 Java 的本源,即通過 main 方法方式引導(dǎo)啟動.表1中的Spring boot啟動時間基本上就是JVM中的啟動時間,可見Spring boot框架確實(shí)對MVC設(shè)計(jì)模式達(dá)到了優(yōu)化,而且優(yōu)化得比較徹底.