Java是一個(gè)生態(tài)體系,涉及的知識(shí)方方面面,從何處入手開(kāi)講,是個(gè)選擇。
Java目前用于企業(yè)、互聯(lián)網(wǎng)的方方面面,也和我們每個(gè)人息息相關(guān),常見(jiàn)的應(yīng)用場(chǎng)景有以下方面:
1、企業(yè)應(yīng)用開(kāi)發(fā)
2、互聯(lián)網(wǎng)開(kāi)發(fā)
3、大數(shù)據(jù)
4、安卓開(kāi)發(fā)
5、Socket通信開(kāi)發(fā)
每個(gè)應(yīng)用場(chǎng)景都包含不同的技術(shù),雖然都是java語(yǔ)言,但是除了語(yǔ)法相同外,其余差距較大。
先說(shuō)企業(yè)應(yīng)用開(kāi)發(fā),這個(gè)簡(jiǎn)稱(chēng)BS開(kāi)發(fā),就是瀏覽器端和服務(wù)器端編程。因?yàn)楝F(xiàn)在的企業(yè)內(nèi)部管理系統(tǒng)多數(shù)都是BS模式了,還有極個(gè)別強(qiáng)業(yè)務(wù)、強(qiáng)操作的是CS,比如調(diào)度系統(tǒng)、視頻監(jiān)控系統(tǒng)等。BS相比CS的好處就是只要有個(gè)機(jī)器裝了瀏覽器,就可以訪問(wèn)系統(tǒng),簡(jiǎn)單方便,而且現(xiàn)在移動(dòng)端也越來(lái)越普及,手機(jī)就可以直接使用管理系統(tǒng),基本做到了移動(dòng)辦公。
當(dāng)然這個(gè)BS的好處是顯而易見(jiàn)的,這個(gè)好處是針對(duì)使用用戶的,對(duì)開(kāi)發(fā)人員提出來(lái)更高的要求。我最早也是做CS開(kāi)發(fā)的,VB、Delphi都很熟悉,也做過(guò)不少,做CS開(kāi)發(fā)的好處就是一個(gè)人基本能搞定界面設(shè)計(jì)、邏輯開(kāi)發(fā)、數(shù)據(jù)庫(kù)設(shè)計(jì)等,相對(duì)簡(jiǎn)單一些。但是到了BS,發(fā)現(xiàn)變化好多,首先是瀏覽器的交互方式變了,要求美觀方面也變了,以前是能用就行,現(xiàn)在是不光能用,而且要人性化設(shè)計(jì)。所以出來(lái)了UI設(shè)計(jì)工程師、用戶體驗(yàn)工程師,對(duì)開(kāi)發(fā)領(lǐng)域做了更大的細(xì)分。為了應(yīng)對(duì)這些,我們開(kāi)發(fā)中要學(xué)習(xí)的東西更多了,不光是邏輯開(kāi)發(fā)、還有界面開(kāi)發(fā)。這兩年隨著H5的普及,UI技術(shù)突飛猛擊,我?guī)滋觳魂P(guān)注,一些新的技術(shù)就不懂了。比如Angular,Angular2才出來(lái)沒(méi)幾天,Angular4就出來(lái),更可怕的是Angular5正在內(nèi)測(cè)。這些東西大版本升級(jí),很多內(nèi)部接口都會(huì)變,都需要開(kāi)發(fā)人員重新熟悉掌握。常見(jiàn)的后臺(tái)開(kāi)發(fā)模式是MVC,現(xiàn)在呢,前端也分MVC,而且更細(xì)化是MVVM,使用這些模式的框架包括Angular、React、Vue等,不學(xué)都不行。
前端說(shuō)了這么多,再說(shuō)說(shuō)后端,這個(gè)就更復(fù)雜了,開(kāi)源框架一個(gè)接著一個(gè)。老外的思想很單純,我看著這個(gè)框架不爽,我就自己寫(xiě)一個(gè),國(guó)外的思想是看著不爽,那就湊合用,等有更好的我再換,所以國(guó)內(nèi)的技術(shù)比國(guó)外還是落后幾年的。說(shuō)后端開(kāi)發(fā)肯定是從MVC說(shuō)起,最基礎(chǔ)的是JSP+Servlet+JavaBean,這一套我用過(guò)好多年,除了代碼量多一些,不夠優(yōu)雅外,還是基本可以的,簡(jiǎn)單,基本倆小時(shí)就能熟悉上手。沒(méi)有各種各樣的新名詞,碰到對(duì)象就new。當(dāng)然這一套應(yīng)對(duì)小系統(tǒng)、功能不復(fù)雜、訪問(wèn)量不大的是沒(méi)問(wèn)題的,而且好多東西也可以依賴(lài)Servlet自帶的實(shí)現(xiàn),比如filter、基于timer的定時(shí)任務(wù)、listener、session等。
控制層
后來(lái)Struts1橫空出世了,當(dāng)時(shí)是引起轟動(dòng)的,因?yàn)椴还苁窃趯W(xué)校還是在企業(yè),如果會(huì)struts,不得了啊,這就是技術(shù)高人一等的感覺(jué)。我用struts1也做過(guò)幾個(gè)項(xiàng)目,后來(lái)就不再用了,原因就是太繁瑣了,不管是formbean的配置,還是action里面的代碼,繁瑣無(wú)比,解決的主要問(wèn)題就是form字段自動(dòng)封裝,其余的好處沒(méi)發(fā)現(xiàn),可能是做的項(xiàng)目太小。
再后來(lái)webwork和struts2出來(lái)了,簡(jiǎn)化了相當(dāng)多的配置,基本是顛覆struts1,里面引入的好多特性也都非常有用,在開(kāi)發(fā)中最常用的是interceptor、表單標(biāo)簽、action里面表單自動(dòng)封裝,還有后來(lái)的注解。整個(gè)struts2配置相對(duì)簡(jiǎn)單,如果加上通配符,基本上配置沒(méi)有太多。struts2.1后引入了注解,基本上就沒(méi)啥配置了,用的人越來(lái)越多,不過(guò)遺憾的是,struts2有漏洞,拒絕服務(wù)、遠(yuǎn)程獲取服務(wù)器權(quán)限這都是漏洞引起的后果,相當(dāng)嚴(yán)重,好多系統(tǒng)都被攻擊。引起這個(gè)漏洞的原因就是action的參數(shù)封裝太復(fù)雜,就導(dǎo)致黑客高手里面參數(shù)拼一些帶服務(wù)器命令的腳本,來(lái)進(jìn)行攻擊。apache是被動(dòng)防守,有一個(gè)漏洞就打一次補(bǔ)丁,最近幾年基本沒(méi)有新特性,完全是打補(bǔ)丁。公司不管大小還是擔(dān)心被攻擊的,所以現(xiàn)在再有新項(xiàng)目,用struts2的也基本沒(méi)有了,誰(shuí)也不想還沒(méi)開(kāi)發(fā)就被扣上架構(gòu)有缺陷的帽子。
我用struts2大概四年,參與了十多個(gè)項(xiàng)目,還是有比較深刻的體會(huì)的,確實(shí)開(kāi)發(fā)很方便,性能也很不錯(cuò)。但是后來(lái)轉(zhuǎn)springMVC了,趨勢(shì)使然,不可避免。
剛開(kāi)始轉(zhuǎn)springMVC還不太習(xí)慣,不過(guò)用了一周后,發(fā)現(xiàn)SpringMVC太好用了。設(shè)計(jì)SpringMVC的人也確實(shí)獨(dú)具慧眼,加上注解的引用,代碼寫(xiě)不了幾句就能完成大多數(shù)controller層的功能。最主要的是和spring無(wú)縫銜接,不像struts2還必須有一個(gè)struts-for-spring的插件來(lái)完成集成。現(xiàn)在基本項(xiàng)目controller都是采用SpringMVC,然后去年出現(xiàn)了SpringBoot,這是后話,以后再講這個(gè)。
持久層
06年那會(huì),Hibernate火起來(lái)了,火的原因就是項(xiàng)目開(kāi)發(fā)不用寫(xiě)sql了,解放數(shù)據(jù)庫(kù)了,而且兼容各個(gè)數(shù)據(jù)庫(kù)。我是下過(guò)好幾次決心要精通hibernate的,無(wú)奈確實(shí)學(xué)習(xí)曲線很高,最后還是在11年通過(guò)中石化的項(xiàng)目最終精通了,而且是相當(dāng)精通,原因就是數(shù)據(jù)庫(kù)的表設(shè)計(jì)不合理,全是大表,而且沒(méi)有主鍵,兩個(gè)表之間的關(guān)聯(lián)都是多字段對(duì)應(yīng)。那段時(shí)間每天都在研究hibernate的字段映射,多表關(guān)聯(lián)有中間表和無(wú)中間表怎么設(shè)計(jì),對(duì)應(yīng)的HQL怎么寫(xiě)。當(dāng)時(shí)的Hibernate版本是3.1,還發(fā)現(xiàn)了幾個(gè)多表關(guān)聯(lián)的錯(cuò)誤。Hibernate還有一個(gè)大坑是JPA1.0和2.0的,Hibernate3.1是實(shí)現(xiàn)自己的持久化接口,到3.6版本后改為實(shí)現(xiàn)JPA2.0的接口,這個(gè)大坑就是WebLogic部署不支持了,和weblogic自帶的有沖突,記得有一次項(xiàng)目部署,元旦期間,從白天部署,到凌晨三點(diǎn)還沒(méi)搞好,最后改成tomcat了。至今想起來(lái)就覺(jué)得不該采用Hibernate,功能很簡(jiǎn)單,就是因?yàn)镠ibernate,耽誤太多事。Hibernate火的原因我感覺(jué)有以下幾個(gè):
1、程序員不用寫(xiě)sql了,這對(duì)于數(shù)據(jù)庫(kù)不熟悉的人是個(gè)福音,但是做開(kāi)發(fā),如果不精通sql,肯定沒(méi)發(fā)展,所以這并不是好消息。而且如果是復(fù)雜sql需要調(diào)優(yōu),Hibernate基本是無(wú)法實(shí)現(xiàn)的。
2、寫(xiě)代碼可以不用考慮數(shù)據(jù)庫(kù)因素了,可以跨數(shù)據(jù)庫(kù)了。這個(gè)其實(shí)是有些自己騙自己的意思。首先至今為止我還沒(méi)碰到哪個(gè)項(xiàng)目初期是用oracle,后期改mysql的,生產(chǎn)中換數(shù)據(jù)庫(kù)的場(chǎng)景非常非常少。第二是各個(gè)數(shù)據(jù)庫(kù)都有各自的特性,如果純用Hibernate,有些特性是體現(xiàn)不出來(lái)的,比如mysql和sqlserver有自增主鍵,ID直接是AutoIncrement即可,但是Oracle是沒(méi)有自增主鍵的,得通過(guò)序列來(lái)完成,所有ID的生成策略就是加了一個(gè)IDGenerator,用Sequence來(lái)實(shí)現(xiàn)這個(gè)自增序列。
3、用Hibernate顯得很高端。我問(wèn)過(guò)好多人,項(xiàng)目持久層是用什么做的,他們很驕傲的說(shuō)Hibernate,然后我問(wèn)有沒(méi)有在實(shí)體里面實(shí)現(xiàn)一對(duì)多和多對(duì)一的關(guān)聯(lián)關(guān)系,然后他們說(shuō)沒(méi)有。Hibernate的核心價(jià)值就是關(guān)聯(lián)關(guān)系,既然沒(méi)有用,那Hibernate得唯一用途就是簡(jiǎn)化增刪改,并沒(méi)有起太大作用。
所以現(xiàn)在好多項(xiàng)目基本上不怎么用Hibernate了,主要是學(xué)習(xí)成本太高,一般人不容易駕馭,如果項(xiàng)目很小,為了快速開(kāi)發(fā),那可以用Hibernate,如果項(xiàng)目很復(fù)雜, 有性能要求,那就最好不要用。
下面說(shuō)說(shuō)mybatis吧,這個(gè)前身是ibatis,更新比較慢,最新的更新也僅僅是加入了注解,支持通過(guò)注解來(lái)完成sql的封裝,意義不是很大。mybatis的核心是實(shí)體的映射和動(dòng)態(tài)sql,優(yōu)勢(shì)還是有的,而且互聯(lián)網(wǎng)公司用的還比較多,好多項(xiàng)目都是ssm框架了。但是通過(guò)我的使用,我發(fā)現(xiàn)mybatis依然存在不少問(wèn)題,首先是xml的配置問(wèn)題,出問(wèn)題很難發(fā)現(xiàn),尤其是項(xiàng)目里面好多xml的mapper配置文件,如果當(dāng)中有一個(gè)出錯(cuò)了,那就使勁找問(wèn)題吧,因?yàn)閳?bào)錯(cuò)的地方往往不是那個(gè)文件,最后快崩潰才找到原因。第二是動(dòng)態(tài)sql,尤其是拼oracle分頁(yè)時(shí),尤其復(fù)雜,oracle的分頁(yè)語(yǔ)句不同于mysql,需要兩層嵌套,再加入動(dòng)態(tài)查詢條件,非常復(fù)雜的,最終的可讀性就比較低。
再說(shuō)JDBCTemplate,這也是spring全家桶里面的,基本和mybatis類(lèi)似,實(shí)現(xiàn)的主要功能就是實(shí)體和sql的映射,代碼寫(xiě)不了幾句就能完成大多數(shù)dao層的操作,最主要的原因就是能很清晰的看到sql,非常利于開(kāi)發(fā)人員調(diào)試?,F(xiàn)在市面上比較多的也就是mybatis和JDBCTemplate的比較,有些爭(zhēng)議,這個(gè)沒(méi)有定論,哪個(gè)熟悉,哪個(gè)順手用哪個(gè),不要套上效率低的帽子,這倆效率基本一致。反正我現(xiàn)在清一色的JDBCTemplate,方便調(diào)試sql。
Spring
最后是spring,這個(gè)目前沒(méi)有太多的選擇,而且也沒(méi)有人去質(zhì)疑該不該用spring。記得在2005年時(shí),好多人還在爭(zhēng)論用不用EJB2,后來(lái)又除了EJB3,這倆東西我都用過(guò),確實(shí)是龐然大物,里面的配置依賴(lài)無(wú)比繁瑣,層層嵌套,想精通這東西確實(shí)很難。而且這個(gè)加了一個(gè)E在里面,就是Enterprise,企業(yè)家開(kāi)發(fā)采用的了這東西,普通的小系統(tǒng)根本就別想碰這個(gè)。Spring當(dāng)初的定位是輕量級(jí)的開(kāi)發(fā)容器,后來(lái)隨著Spring用的人越來(lái)越多,EJB發(fā)現(xiàn)自己根本不是Spring的對(duì)手,沒(méi)有市場(chǎng)了。時(shí)至今日,也基本都是Spring在主導(dǎo)這一塊,有些獨(dú)孤求敗的意思,很孤獨(dú)的存在,一直在領(lǐng)跑, 從未被超越。
Spring一統(tǒng)天下的好處是多多的,社區(qū)活躍,大牛數(shù)不勝數(shù),對(duì)Spring體系的貢獻(xiàn)也非常多,所以一開(kāi)始的Spring核心IOC+AOP也慢慢擴(kuò)展了,包括整合JPA、redis、mongodb、rest、rabbitmq等等,都可以通過(guò)spring很簡(jiǎn)單的整合進(jìn)來(lái)。反正我是受益良多,不用自己寫(xiě)好多代碼來(lái)保證穩(wěn)定性。
行了, 上面三個(gè)說(shuō)完就是談的最多的,整合了,SSH、SSM、SSH2等各種提法,都沒(méi)有問(wèn)題,都是成熟的企業(yè)開(kāi)發(fā)框架,只要適合團(tuán)隊(duì),能快速開(kāi)發(fā)調(diào)試,就是沒(méi)問(wèn)題的。我現(xiàn)在提倡的是全Spring系列,即Spring+SpringMVC+JDBCTemplate,不依賴(lài)外部,自己實(shí)現(xiàn)。這只是建議,具體好壞自己體驗(yàn)便知。