目前 Java 后端有哪些不是很有必要去學(xué)的?
原文鏈接:https://juejin.cn/post/6995011547902771207

今天要談一下那些Java知識(shí)“已經(jīng)過(guò)時(shí)”,沒(méi)必要繼續(xù)學(xué)習(xí)了。
判斷的依據(jù)主要有以下幾點(diǎn):
實(shí)際開(kāi)發(fā)能否用到?
是否有助于加深對(duì)技術(shù)的理解?
對(duì)面試是否有用?
JSP
JSP在實(shí)際開(kāi)發(fā)中,主要是作為MVC模型中的V(View)層出現(xiàn)的。當(dāng)然,View層的渲染技術(shù)除了JSP,還有FreeMaker、Velocity等。
JSP作為頁(yè)面模板,在后端通過(guò)MVC框架渲染成HMTL,然后再發(fā)送到客戶(hù)端(例如瀏覽器)來(lái)呈現(xiàn)。這也就是我們常說(shuō)的“前后端不分離”,“混合式”開(kāi)發(fā)。
而當(dāng)前,包括很多的公司,以及大部分互聯(lián)網(wǎng)公司。要么已經(jīng)拋棄這種模式,要么正在拋棄的路上,而轉(zhuǎn)向徹底的“前后端分離”。
在“前后端分離”模式下,后端只負(fù)責(zé)提供服務(wù)接口(例如REST),而前端(例如HTML5)通過(guò)接口發(fā)送/獲取,呈現(xiàn)數(shù)據(jù)(例如JSON格式)。
這樣,在后端,原來(lái)的MVC框架,某種意義上已經(jīng)演變?yōu)镸C框架。因此,與V(View)相關(guān)的一切模板技術(shù)都失去了學(xué)習(xí)的必要,其中當(dāng)然也包括JSP。
**所以,后來(lái)的Java學(xué)習(xí)者,我的建議是:
“完全可以放棄對(duì)JSP的學(xué)習(xí)。”
Struts
在Java后端開(kāi)發(fā)中,MVC模型還是主流。而Struts作為一個(gè)MVC框架,單從技術(shù)上來(lái)說(shuō),還是很優(yōu)秀的。
但是,現(xiàn)在Spring實(shí)在是太強(qiáng)勢(shì)了,越來(lái)越成為Java開(kāi)發(fā)中的“一站式”工具包,其中的一個(gè)利器就是Spring MVC。
望名知意,Spring MVC也是一個(gè)MVC框架。而且因?yàn)樗荢pring的親兒子,自然和Spring契合的非常完美。
同時(shí),在設(shè)計(jì)之初,Spring MVC就參照了其他MVC框架的優(yōu)缺點(diǎn)(包括Struts),所以用起來(lái)非常爽。因此,在MVC框架領(lǐng)域,Spring MVC大有一統(tǒng)天下的趨勢(shì)。
因此現(xiàn)在,很多公司,老的Struts項(xiàng)目還在維護(hù)。但新的項(xiàng)目開(kāi)發(fā),更多轉(zhuǎn)向了Spring MVC。
因此,如果你是Java新手,正在學(xué)習(xí)中,我的建議是:
“不要再學(xué)習(xí)Struts了,從Spring MVC開(kāi)始吧!”
Hibernate
Hibernate作為老牌的OR映射框架,功能非常強(qiáng)大,涵蓋面非常廣。但這既是它的優(yōu)點(diǎn),同時(shí)也成為它的“負(fù)擔(dān)”,是開(kāi)發(fā)人員“不能承受之重”。
Hibernate的設(shè)計(jì)初衷,是為了最大程度的解放程序員,完全隔離數(shù)據(jù)庫(kù),實(shí)現(xiàn)徹底的OR映射。程序員甚至可以不寫(xiě)一行SQL語(yǔ)句,單通過(guò)配置就能實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的操作。
當(dāng)然,為了實(shí)現(xiàn)這個(gè)目標(biāo),Hibernate也設(shè)計(jì)的非常復(fù)雜、非常精巧。就不可避免的帶來(lái)以下副作用:
學(xué)習(xí)成本高
配置復(fù)雜
調(diào)優(yōu)困難
前兩點(diǎn)不難理解,單說(shuō)“調(diào)優(yōu)困難”。
因?yàn)镠ibernate的設(shè)計(jì)目標(biāo)是徹底的OR映射,徹底的隔離SQL語(yǔ)句。但必然會(huì)帶來(lái)一定的性能損失。大部分情況下,應(yīng)用如果對(duì)性能不敏感,Hibernate也沒(méi)問(wèn)題。但應(yīng)用一旦對(duì)性能敏感,有SQL級(jí)別調(diào)優(yōu)的需求,Hibernate的優(yōu)點(diǎn)反而成為缺點(diǎn)。
雖然Hibernate也支持SQL級(jí)別的調(diào)優(yōu),但因?yàn)榭蚣茉O(shè)計(jì)的過(guò)于復(fù)雜和精巧,這就需要開(kāi)發(fā)人員對(duì)Hibernate理解的非常透徹,這就帶來(lái)了更高的學(xué)習(xí)成本。
而現(xiàn)在最流行的MyBatis,作為一個(gè)“混合式”,輕量級(jí)OR映射框架,既繼承了Hibernate的優(yōu)點(diǎn),同時(shí)也吸取了他的教訓(xùn)。在支持配置的同時(shí),又能接觸SQL,從而帶來(lái)了更多靈活性(包括調(diào)試、優(yōu)化)。
當(dāng)前,在實(shí)際開(kāi)發(fā)中,Hibernate使用的越來(lái)越少了。大家更偏愛(ài)MyBatis這種輕量級(jí)框架。
所以,對(duì)后來(lái)學(xué)習(xí)者,我的建議是:
“不需要再學(xué)習(xí)Hibernate了,學(xué)MyBatis就夠了。”
Servlet(要精通)
當(dāng)然,現(xiàn)在不會(huì)有任何公司,再用純粹的Servlet來(lái)時(shí)實(shí)現(xiàn)整個(gè)Web應(yīng)用,而是轉(zhuǎn)向一些更高級(jí)的技術(shù)(例如各種MVC框架)。因此,會(huì)給人一種錯(cuò)覺(jué):Servlet已經(jīng)過(guò)時(shí),后來(lái)者就不需要再學(xué)習(xí)了。
在這里,我可以非常負(fù)責(zé)任的說(shuō):這種觀點(diǎn)是極端錯(cuò)誤,極端不負(fù)責(zé)任的。
Servlet不僅要學(xué),而且要學(xué)深,學(xué)透。
當(dāng)前,Servlet雖然不再是一個(gè)主流web開(kāi)發(fā)技術(shù),但依然是Java Web開(kāi)發(fā)技術(shù)的基礎(chǔ),是Java Web容器的基石,是行業(yè)標(biāo)準(zhǔn)。而現(xiàn)在流行的各種MVC框架(包括SpringMVC),在最底層,還是以 Servlet為基礎(chǔ)的。
為此,我畫(huà)了一個(gè)簡(jiǎn)單的圖(不準(zhǔn)確,會(huì)意即可):

所以,如果你想要徹底掌握某個(gè)MVC框架,則必須徹底理解Servlet。
而且,Servlet作為一個(gè)基礎(chǔ)設(shè)施。精通它,不僅有助于理解各種MVC框架。即使Servlet本身,也有很多實(shí)用價(jià)值。
如果你深刻理解了Servlet的生命周期,就可以在底層做很多事情。譬如在Request進(jìn)來(lái)的時(shí)候,進(jìn)行攔截,進(jìn)行權(quán)限的判定。也可以在Response發(fā)出的時(shí)候,進(jìn)行攔截,統(tǒng)一檢查、統(tǒng)一附加。
所以,如果你正在學(xué)習(xí)Java,對(duì)Servlet,我的建議是:
“Servlet不僅要學(xué),而且要學(xué)深,學(xué)透。”
其他
目前在國(guó)內(nèi),Java更多是作為web后端技術(shù)出現(xiàn)的。因此在實(shí)際學(xué)習(xí)中,很多技術(shù)就不符合“國(guó)情”,學(xué)習(xí)的現(xiàn)實(shí)意義不大。下面我就簡(jiǎn)單列舉下。
1.Applet
作為頁(yè)面插件技術(shù),不用多說(shuō),連flash都快被淘汰了,更無(wú)論從未流行的applet。
2.Swing
作為桌面UI框架。且不說(shuō)本身設(shè)計(jì)的咋樣。現(xiàn)實(shí)開(kāi)發(fā)中,我接觸的桌面應(yīng)用,要么用C++(例如MFC),要么用C#(Winform、WPF)。所以,Swing就沒(méi)有學(xué)習(xí)的必要了。
3.JDBC
作為較低層的數(shù)據(jù)庫(kù)基礎(chǔ)設(shè)施,JDBC被很多框架(例如MyBatis)支持。但在實(shí)際開(kāi)發(fā)中,程序員即使不了解也無(wú)大礙。因此,雖然我不能建議你放棄JDBC學(xué)習(xí),但如果你時(shí)間有限,完全可以把它的優(yōu)先級(jí)排低一點(diǎn)。
4.XML
XML現(xiàn)在還在廣泛應(yīng)用。但作為一個(gè)web數(shù)據(jù)傳輸格式,正在逐漸被JSON替代。所以,對(duì)Java后端學(xué)習(xí)來(lái)說(shuō),XML簡(jiǎn)單了解即可。至于龐雜的XML操作API(例如XPath),完全不必學(xué)習(xí)。將來(lái)真要用到,再查也不遲。
最后
無(wú)論java的技術(shù)是你必須要掌握的還是已經(jīng)“過(guò)時(shí)的技術(shù)”,最重要的還是你的java基礎(chǔ)知識(shí),只有java基礎(chǔ)知識(shí)打牢固,你才能越怕越高,不然你就會(huì)半路重重的摔下。
