對(duì)javaEE框架的認(rèn)識(shí)
一、什么是框架
通俗的理解,框架是我們軟件開發(fā)中的一套解決方案,不同的框架解決的問(wèn)題是不同的,比如MyBatis框架解決的是持久層的問(wèn)題,springMVC框架解決的是表現(xiàn)層的問(wèn)題。
需要注意的是,框架它本身自己是不能實(shí)現(xiàn)業(yè)務(wù)上的功能,它只能對(duì),比如說(shuō)持久層、表現(xiàn)層、結(jié)構(gòu)合理性等等,提供一些解決方案,而真正的業(yè)務(wù)層部分,還需要程序員自己來(lái)提供。所以說(shuō),框架可以理解為一個(gè)半成品,我們選用這個(gè)半成品,然后加上業(yè)務(wù)需求(即項(xiàng)目中的需求)來(lái)最終實(shí)現(xiàn)整個(gè)的功能。
而我們使用框架的目的其實(shí)也很簡(jiǎn)單,就是為了提高開發(fā)的效率,而不用關(guān)心一些繁瑣的、復(fù)雜的底層代碼實(shí)現(xiàn),從而把更多的精力用在需求的實(shí)現(xiàn)上。
二、框架能幫我們解決哪些問(wèn)題
要明白框架能解決哪些問(wèn)題,首先要知道三層架構(gòu)。
三層架構(gòu)分為三層:
表現(xiàn)層:是用于展示數(shù)據(jù)的;
業(yè)務(wù)層:是處理業(yè)務(wù)需求的;
持久層:是和數(shù)據(jù)庫(kù)交互的。
從這張圖可看出上面列出的三個(gè)框架和三層架構(gòu)所處的位置??梢钥闯鯩yBatis框架是一個(gè)持久層框架,它是和數(shù)據(jù)庫(kù)交互的;而下面的Spring框架有點(diǎn)特殊,它不屬于任何一層;SpringMVC框架是處于表現(xiàn)層的,它是一個(gè)表現(xiàn)層框架。
從這張圖可大致得出,不同的框架是各司其職的,它們解決某一層或者某一類的事情。
三、對(duì)一些主流框架的認(rèn)識(shí)
由于以下具體的框架都沒(méi)有學(xué)過(guò),所以只能說(shuō)一說(shuō),我對(duì)這些框架的大體認(rèn)識(shí),可能對(duì)于某些框架沒(méi)用使用過(guò)和對(duì)比過(guò)很難對(duì)它的優(yōu)勢(shì)有深刻的認(rèn)識(shí),只能在后續(xù)的學(xué)習(xí)中,深入理解。
1、Struts2框架
Struts2框架處于三層架構(gòu)的表現(xiàn)層,可以用來(lái)替代掉Servlet技術(shù),來(lái)處理前端訪問(wèn)服務(wù)器的請(qǐng)求(如表單、頁(yè)面提交過(guò)來(lái)的請(qǐng)求),所以Struts2是屬于一個(gè)前端處理的框架。
下圖顯示了Struts2框架在三層架構(gòu)中的位置:
對(duì)于web日常的工作,比如獲取請(qǐng)求參數(shù)、轉(zhuǎn)發(fā)、重定向、校驗(yàn)參數(shù)等等,使用Servlet技術(shù)基本都可以完成。既然使用Servlet技術(shù)基本都可以完成我們的需求,為什么還要使用Struts2這個(gè)框架呢?原因在于Struts2有其自身的優(yōu)勢(shì),相比使用Servlet,Struts2用起來(lái)更加方便,很多事情它自動(dòng)就幫我們做了,而且Struts2還具有更加先進(jìn)的架構(gòu)和思想。
對(duì)于Struts2框架的歷史也非常有意思,大部分框架不同版本之間性質(zhì)上不會(huì)有什么改變,基本是不斷修改bug和完善功能,而Struts2和它之前的版本Struts1之間的最大區(qū)別就是技術(shù)上沒(méi)什么關(guān)系,這就要從Struts的歷史說(shuō)起。
在早年Struts2還沒(méi)出來(lái)的時(shí)候,Struts1特別火,用得很廣,但這時(shí)候Struts1的作者非??鄲?,因?yàn)镾truts1當(dāng)時(shí)雖然很好用,但是它基于的架構(gòu)和所有的功能構(gòu)建都是在Servlet之上(這里指的不是Servlet技術(shù),而是具體的Servlet類),而Servlet是線程不安全的,所以導(dǎo)致整個(gè)Struts1框架也是處于一種線程不安全狀態(tài),使得很多的功能無(wú)法落實(shí),所以Struts1的作者就很苦惱這個(gè)問(wèn)題,他一直在研發(fā)新的架構(gòu)。與此同時(shí),另外有一個(gè)團(tuán)隊(duì)也非??鄲溃@個(gè)團(tuán)隊(duì)(也就是WebWork團(tuán)隊(duì))也開發(fā)了一款前端處理框架,但是他們是后來(lái)人,他們看到了Struts的缺陷,于是他們開發(fā)出來(lái)的框架同樣也是基于Servlet技術(shù),但它們基于的是Filter(過(guò)濾器),這樣設(shè)計(jì)出來(lái)的框架會(huì)靈活很多,而且從架構(gòu)上來(lái)說(shuō)徹底擺脫了線程安全問(wèn)題??墒钱?dāng)時(shí)滿大街用的都是Struts1框架,WebWork團(tuán)隊(duì)辛辛苦苦開發(fā)出的框架根本沒(méi)人用,推廣不出去。于是,WebWork就想了一個(gè)辦法,找到了Struts1的作者想要一起合作,Struts的作者看到這個(gè)新的框架后,兩者一拍即合,于是有了Struts2框架。所以Struts2的前身就是WebWork,而Struts1和Struts2兩者基本是兩個(gè)不同的框架,當(dāng)然后來(lái)Struts1的作者也把自己之前想要在Struts1中實(shí)現(xiàn)的想法帶入到了Struts2中來(lái),所以現(xiàn)在的Struts2框架是一個(gè)強(qiáng)強(qiáng)聯(lián)手的框架,整合了Struts1和WebWork的優(yōu)點(diǎn)。
2、SpringMVC
要了解SpringMVC,首先來(lái)看看MVC模型,對(duì)于表現(xiàn)層的框架一般都會(huì)采用MVC這種設(shè)計(jì)模型去做架構(gòu),MVC即:
M model 模型:實(shí)際上就是java中JavaBean的一個(gè)對(duì)象,用來(lái)封裝數(shù)據(jù);
V View 視圖:其中指的是jsp技術(shù)或者HTML這種技術(shù),用來(lái)顯示;
C Controller 控制器:指的是像Servlet這種技術(shù),能用來(lái)接收請(qǐng)求。
MVC這種設(shè)計(jì)模型的意思就是,發(fā)請(qǐng)求,請(qǐng)求先到達(dá)控制器(Controller),控制器接收請(qǐng)求,請(qǐng)求接收到之后,再用一個(gè)JavaBean(model)把拿到的數(shù)據(jù)封裝起來(lái),根據(jù)這個(gè)JavaBean中封裝的數(shù)據(jù)就可以調(diào)用業(yè)務(wù)層進(jìn)行業(yè)務(wù)處理,業(yè)務(wù)層如果再訪問(wèn)持久層的數(shù)據(jù),也可以再把數(shù)據(jù)封裝到JavaBean當(dāng)中,最終可以把程序轉(zhuǎn)發(fā)到j(luò)sp(view),jsp顯示結(jié)果生成HTML響應(yīng)給用戶,這就是整個(gè)一個(gè)MVC模型,分工非常明確。
SpringMVC框架也是一個(gè)處于表現(xiàn)層的框架,是采用MVC模型來(lái)設(shè)計(jì)的,所以它能夠接受請(qǐng)求,拿到請(qǐng)求參數(shù),并進(jìn)行數(shù)據(jù)的封裝,還可以轉(zhuǎn)發(fā)到j(luò)sp顯示對(duì)應(yīng)的數(shù)據(jù)。同時(shí),它也是一個(gè)輕量級(jí)的web框架,它屬于Spring FrameWork的一個(gè)后續(xù)產(chǎn)品,已經(jīng)融合在Spring Web Flow中。做web開發(fā)可以選擇SpringMVC這個(gè)框架,也可以選擇別的框架(比如Struts2),因?yàn)樽罱KSpring都可以幫你集成。但使用SpringMVC更有好處,因?yàn)镾pringMVC屬于Spring的一部分,SpringMVC和Spring的整合相比別的框架更加容易。
SpringMVC目前已經(jīng)成為最主流的框架之一,并且隨著Spring3.0的發(fā)布,已經(jīng)全面超越Struts2,成為最優(yōu)秀的MVC框架。
它通過(guò)一套注解,讓一個(gè)簡(jiǎn)單的Java類成為處理請(qǐng)求的控制器,而無(wú)須實(shí)現(xiàn)任何接口,而如果我們使用Servlet,必須繼承HttpServlet或者實(shí)現(xiàn)Servlet接口。同時(shí)它還支持RESTful編程風(fēng)格的請(qǐng)求。
3、Hibernate框架和Mybatis
Hibernate框架是一個(gè)全自動(dòng)的、完全面向?qū)ο蟮某志脤涌蚣?,代替了以往的DButils幫助我們完成數(shù)據(jù)庫(kù)操作。
下圖顯示了Struts2框架在三層架構(gòu)中的位置:
使用Hibernate框架的好處:能夠使我們操作數(shù)據(jù)庫(kù)時(shí),可以用面向?qū)ο蟮姆绞絹?lái)完成,而不需要寫SQL語(yǔ)句。
Hibernate是一款orm框架,orm(Object Relational Mapping,)即對(duì)象關(guān)系映射,在hibernate中體現(xiàn)為使用一個(gè)配置文件來(lái)配置表,即對(duì)象與數(shù)據(jù)中表之間的映射關(guān)系,其中對(duì)象名對(duì)應(yīng)一個(gè)表名,對(duì)象屬性對(duì)應(yīng)表中的某一列。
相對(duì)于Hibernate,Mybatis框架是一個(gè)半自動(dòng)化的持久層框架,同樣也是用于完成數(shù)據(jù)庫(kù)操作。相比hibernate框架,兩者有相同點(diǎn)也有不同點(diǎn),hibernate框架sql語(yǔ)句已經(jīng)被封裝,直接可以使用,而mybatis 屬于半自動(dòng)化,sql需要手工完成,稍微繁瑣,但可以避免不需要的查詢,提高系統(tǒng)性能。同時(shí)Mybatis通過(guò)手動(dòng)寫SQL語(yǔ)句,也更容易維護(hù)。
在開發(fā)工程中,Hibernate框架無(wú)需過(guò)多關(guān)注底層實(shí)現(xiàn),只要去管理對(duì)象即可,而Mybatis需要自行管理映射關(guān)系。
總結(jié)起來(lái),Mybatis相比于Hibernate,更加的小巧、簡(jiǎn)單,某些操作需要我們自己完成。
3、Spring框架
Spring是分層的Java SE/EE應(yīng)用full-stack(全棧式)輕量級(jí)開源框架,以IOC(Inverse Of Control 反轉(zhuǎn)控制)和AOP(Aspect Oriented Programming 面向切面編程)為內(nèi)核,提供了表現(xiàn)層MVC和持久層Spring JDBC以及業(yè)務(wù)層事務(wù)管理等眾多的企業(yè)級(jí)應(yīng)用技術(shù),還能整合眾多著名的開源第三方框架和類庫(kù),逐漸成為使用最多的JavaEE企業(yè)應(yīng)用開源框架。
從這張圖可看出,Spring不屬于任何一層,它橫跨了三層架構(gòu),它是一個(gè)以IOC和AOP為核心的容器框架,能管理應(yīng)用對(duì)象的生命周期。我們之前創(chuàng)建對(duì)象一般都要通過(guò)new + 構(gòu)造方法,而且每new一次就要開辟一塊內(nèi)存空間,這樣如果項(xiàng)目中使用了1000個(gè)對(duì)象,就需要開辟1000塊內(nèi)存空間,而在某段時(shí)間中我們可能并不同時(shí)需要這1000個(gè)對(duì)象,這樣就造成了資源的浪費(fèi),如果使用Spring這個(gè)容器,它就會(huì)自動(dòng)幫我們管理這些對(duì)象的生命周期,就像tomacat容器幫我們管理Servlet的生命周期一樣。
對(duì)AOP的簡(jiǎn)單理解:之前我們一直學(xué)的是OOP(面向?qū)ο缶幊蹋?,因?yàn)镺OP存在某些缺陷,所以有了AOP(面向切面編程)去對(duì)OOP進(jìn)行補(bǔ)充,所以AOP和OOP之間的關(guān)系不是包含關(guān)系,而是AOP是對(duì)OOP的補(bǔ)充。
Spring優(yōu)點(diǎn)還在于組件化,Spring中的組件指的就是Spring所管理的對(duì)象。一個(gè)項(xiàng)目對(duì)我們來(lái)說(shuō),可以理解為由各個(gè)類產(chǎn)生對(duì)象,由對(duì)象調(diào)用方法,最終實(shí)現(xiàn)功能。而Spring可以把項(xiàng)目中用到的類進(jìn)行管理,把這些對(duì)象稱為組件,項(xiàng)目的實(shí)現(xiàn)由各個(gè)對(duì)象相互調(diào)用方法就可以變成組件之間的相互調(diào)用,這樣項(xiàng)目就被組件化了。組件化的好處在于,組件與組件之間是沒(méi)有關(guān)系的,這樣就降低了程序之間的耦合。
Spring各個(gè)模塊結(jié)構(gòu):
4、SpringBoot框架
SpringBoot框架是基于Spring框架的,所以SpringBoot本質(zhì)還是Spring框架,它的出現(xiàn)是替代Spring中的缺點(diǎn)的,SpringBoot是對(duì)Spring的進(jìn)一步封裝,所以Spring能做的SpringBoot都能做,而且SpringBoot更加好用。
對(duì)Spring存在的缺點(diǎn)的簡(jiǎn)單理解:首先使用Spring框架,需要進(jìn)行的配置是十分繁瑣的,而且有些配置不論誰(shuí)使用都是一樣的,所以沒(méi)有必要每次都配置;其次,項(xiàng)目的依賴管理也是一件耗時(shí)耗力的事情,在環(huán)境搭建時(shí),需要分析導(dǎo)入庫(kù)以及相關(guān)聯(lián)庫(kù)的坐標(biāo),一旦選錯(cuò)了依賴的版本,可能就會(huì)帶來(lái)不兼容的問(wèn)題。
而SpringBoot對(duì)上述的Spring存在的問(wèn)題都提出了解決方案。它基于約定優(yōu)于配置的思想,對(duì)于某些固定的配置自動(dòng)就幫你配好了,讓開發(fā)人員把更多的精力放在業(yè)務(wù)邏輯的處理上;而SpringBoot用起步依賴的方式,把具備某些功能的坐標(biāo)打包到一起,方便導(dǎo)入,并提供了一些默認(rèn)的功能。
綜上,SpringBoot框架可以理解為對(duì)Spring的一種完善,它不是對(duì)Spring功能上的增強(qiáng),而是提供了一種快速使用Spring的方式。
四、總結(jié)
對(duì)于java web開發(fā)框架,開始是SSH(Struts、Spring、Hibernate)較為流行,后來(lái)升級(jí)為Struts2,到后來(lái)Struts2漸漸被SpringMVC替換掉,變成了Spring + SpringMVC + Hibernate/ibatis架構(gòu)。
之后Hibernate配置維護(hù)需要的人力成本大而慢慢被ibatis代替,后來(lái)MyBatis出現(xiàn)了,從iBatis到MyBatis,MyBatis提供了更為強(qiáng)大的功能,同時(shí)并沒(méi)有損失其易用性,就變成為了Spring+SpringMVC+Mybatis,這是很多公司比較流行的框架。
目前,隨著SpringBoot的流行,開始向SpringBoot+Mybatis架構(gòu)轉(zhuǎn)變,同時(shí)基于SpringBoot的SpringCloud微服務(wù)框架開始成為前沿框架。
聯(lián)系客服