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