主頁 >  其他 > 對于自學Java的人來說,如何系統的,全方面的學習Java?

對于自學Java的人來說,如何系統的,全方面的學習Java?

2021-12-18 07:51:43 其他

我今年41歲,使用Java開發將近20年了,目前還在技術一線,

雖然我是科班出身,但其實十多年走過來,無論是Java語言本身,還是相伴的工具和框架都發生了巨大變化,而我自己也是一路學習新技能,一路丟棄舊知識,

而今天回頭看,也發現自己走了很多彎路,浪費了不少時間,很是遺憾!

但是,因為你是自學,面臨巨大的入行壓力,因此就不該付出太高的試錯成本,而應該尋找一條有重點的,高效的學習方法,否則一不小心,很有可能倒在入行的門口,前功盡棄,

但好在Java學習,總的來說還是重點突出、難點分明的,也確實存在一條高效的學習路徑,

過去半年,我不斷的盤整自己的思路,陸續寫了幾篇文章,來分享我對高效學習Java的看法,但不足之處是,這些文章都分散在不同的回答下,因此,今天剛好趁此機會,我把它們整理起來,希望對你的學習有幫助,

1.Java學習的重點是什么?

從大學到現在,我使用Java已經將近20年,日常也帶實習生,還在公司內部做training,所以可以分享下我的經驗,希望對你有用,

因為是在作業中培訓,就必然有兩個約束:實用、時間緊,因此就不能像大學那樣,把所有的知識點都面面俱到的講到,而只能挑基礎的,實用的,難理解的講,至于其他邊邊角角的知識,就一筆帶過,一則沒有時間,二則不常用,再則既使講了,學生印象也不深刻,總之一句話:“好鋼用在刀刃上”,

下面,就根據我的實踐,具體談下學習程序:

1.基礎知識

我學習java的時候,先是通讀了《Java編程思想》,然后是《Java核心技術》,當時這兩本書還不像現在這么厚,而剛才我把案頭的《Java核心技術》第9版翻了翻,上下兩冊已經1700多頁了,可想而知,如果要把它通讀一遍,且不說把所有的代碼都調通,就是當小說讀,估計也需要些時間,

但我現在教學依然首推《Java核心技術》,主要是體系完整,實體多,可操作性強,但對初學者,我一般是只講前6章,也就是下面的內容:

  1. Java程式設計概述
  2. Java程式設計環境
  3. Java的基礎程式設計結構
  4. 物件與類
  5. 繼承
  6. 介面與內部類

就《Java核心技術》第9版來說,也就是到250頁為止,加把勁,1個月拿下完全沒問題,

因為你是自學,所以建議你一定要把其中的代碼都調通,課后的作業盡量去做,除此之外,還有兩點特別重要:

#.學習筆記

因為你是自學,不像在企業中學了就能夠實踐,印象自然特別深刻,而自學因為沒有實踐的及時反饋,所以記筆記就顯得特別重要,因為記筆記就像寫作一樣,是整理思路的絕佳方法,同時學習筆記也是你以后開發,面試的絕好資料,

學習編程,人跟人是不一樣的,別人覺得難理解的東西,對你卻不一定;而你覺得難理解的東西,別人可能又會覺得特簡單,而學習筆記就是自己專有的“難點手冊”,有點像高考時的“錯題本”,以后無論是在面試前,還是在日常作業中,隨時都可以翻出來看看,自是獲益匪淺,

#.分門別類保存demo

學習筆記是很好的文字資料,但編程界有句話說的特別好,所謂“no code, no text”,意思就是說:千言萬語都沒有一段代碼來的實在,

以我的經驗,在你在學習的程序中,就某個知識點,無論當時理解的多透徹,除錯的多棒,只要時間一長,等到了實用的時候,肯定會碰到各種各樣的問題,一些看似簡單的東西,此時死活就是調不通,正所謂人到事中迷,這個時候,如果你手頭恰有運行良好的demo,打開參考一下(甚至直接拷貝過來),問題自然迎刃而解,而且因為這些demo都是你親手除錯出來,印象自然特別深刻,一碰到問題,在腦子中自會立刻涌現,

所以說,在學習的程序,一定要善待你調通的demo,千萬不要用完了就扔,等后來碰到困難,想要用時卻找不到,追愧莫及,正確的做法就是把所有調通的demo,分門別類的保存起來,到時候查起來自是得心應手,

這是我自己創建的java學習交流qun:六一五,七四一,六三六,這里聚集了一幫熱愛學習java的人,如果你也在學習java,苦于一個交流分享的圈子,歡迎你的加入,

人都說“書到用時方恨少”,其實代碼也是這樣,所謂“demo用時方恨少”,

2.Spring

目前在Java EE開發中,Spring已經成為和Java核心庫一樣的基礎設施,所以說如果想成為一個合格的Java程式員,Spring肯定繞不開,另一方面,如果掌握了Spring體系,Java基本上就算入門了,就有能力進行一些實用級的開發了,

但Spring本身也是日漸復雜,衍生專案越來越多,但最最核心的概念依舊是IOC和AOP,掌握了這兩個概念,再把Spring MVC學會,再學習其他的衍生專案就會平滑很多,

同時,因為Spring本身就應用了許多優雅的設計理念,所以學習Spring的程序,也是加強Java基礎知識學習的程序,因此等你掌握了Spring,原來很多你理解不透徹的Java特性,此時就會恍然大悟,包括介面、抽象類等,

我學習Spring,讀的第一本書是《Spring實戰》,坦率的說,書很一般,但市面上比它好的書,我卻沒有遇到過,還有一本《Spring原始碼深度決議》也不錯,對Spring的設計理念講的尤其透徹,雖然整本書讀起來有些艱澀,但前幾章卻生動有趣,也是整本書的精華,所以建議你在學習Spring之前,先把該書的前幾章通讀一下,然后再回過頭來學習《Spring實戰》會順利很多,

以我經驗,要學透Spring,終極的方法還是閱讀原始碼(我當時就是這么干的),待把Spring的核心原始碼通讀了,人就真的自由了(所謂無真相不自由),不僅是對Spring,而是對整個Java體系,以后再遇到其他框架,大概一眼就能看出其中的脈絡,所謂到了“看山不是山”的境界,但這都是后話,可以作為以后你努力的方向,

和學習Java基礎知識一樣,學習Spring也一定要記筆記,一定要分門別類保存demo,老實說,Spring對初學者不算簡單,因此最好能有個好老師帶一下,不用太長時間,2個課時即可,然后就是在你遇到大的困難時,能及時的點撥下,

以我的經驗,要初步掌握Spring,大概需要1到1個半月的時間,

3.其他知識

Spring是Java編程的基礎設施,但真要進入到實際專案的開發,還有些東西繞不過,包括 MySql,Mybatis,Redis,Servlet等,但如果你經過Spring的洗禮,這些東西相對就簡單多了,以我的經驗,1個月的時間足夠了,

4.實踐

學習Java,光學不練肯定是不行的,但因為是自學,所以就沒有實際的產品讓你練手,但也沒有關系,誰大學還沒有做過畢業設計呢?以我的經驗,大家最愛的“學生管理系統”依舊是個很好的練手系統,

別看“學生管理系統”邏輯簡單,但麻雀雖小五臟俱全,其中資料庫設計、Mybatis,Spring、SpringMVC,Servlet、Tomcat一個都不缺,絕對的練手好伴侶,

還有,雖然你的學習重點在Java,因為要做一個完整的demo,前端的配合肯定少不了,因此就免少不了要學一些簡單的JS、HTML知識,但因為前端本就是個很大的topic,所以一定要控制好邊界,千萬不要顧此失彼,就“學生管理系統”來說,在前端上,只要實作一個包含table、textbox、button,能發送REST請求到server,能實作學生的“增刪改查”的簡單頁面即可,

作為一個練手專案,目標就是把Java的主要技能點串起來,所以自不求盡善盡美(也不可能),所以1個月時間足夠了,

最后

按照上面的程序,4個月的時間剛剛好,當然Java的體系是很龐大的,還有很多更高級的技能需要掌握,但不要著急,這些完全可以放到以后作業中邊用別學,

學習編程就是一個由混沌到有序的程序,所以你在學習程序中,如果一時碰到理解不了的知識點,大可不必沮喪,更不要氣餒,這都是正常的不能再正常的事情了,不過是“人同此心,心同此理”的暫時而已,

在日常的教學中,我常把下面這句話送給學員們,今天也把它送給你:

“道路是曲折的,前途是光明的!”

祝你好運!

2.哪些Java知識沒必要學習了

我接觸 Java已近20年了,見證了許多Java技術變遷,包括:

JavaEE框架,從百家混戰到現在Spring基本一統天下,

Web開發,從標配的SSH到現在SpirngMVC + MyBatis組合,

IDE,從當年如火如荼的JBuilder到Eclipse,再到更好用的IDEA,

我判斷的依據主要有以下幾點:

  • 實際開發能否用到?
  • 是否有助于加深對技術的理解?
  • 對面試是否有用?

JSP

JSP在實際開發中,主要是作為MVC模型中的V(View)層出現的,當然,View層的渲染技術除了JSP,還有FreeMaker、Velocity等,

JSP作為頁面模板,在后端通過MVC框架渲染成HMTL,然后再發送到客戶端(例如瀏覽器)來呈現,這也就是我們常說的“前后端不分離”,“混合式”開發,

而當前,包括我所在的公司,以及大部分互聯網公司,要么已經拋棄這種模式,要么正在拋棄的路上,而轉向徹底的“前后端分離”,

在“前后端分離”模式下,后端只負責提供服務介面(例如REST),而前端(例如HTML5)通過介面發送/獲取,呈現資料(例如JSON格式),

這樣,在后端,原來的MVC框架,某種意義上已經演變為MC框架,因此,與V(View)相關的一切模板技術都失去了學習的必要,其中當然也包括JSP,所以,后來的Java學習者,我的建議是:

“完全可以放棄對JSP的學習,”

Struts

在Java后端開發中,MVC模型還是主流,而Struts作為一個MVC框架,單從技術上來說,還是很優秀的,

但是,現在Spring實在是太強勢了,越來越成為Java開發中的“一站式”工具包,其中的一個利器就是Spring MVC,

望名知意,Spring MVC也是一個MVC框架,而且因為它是Spring的親兒子,自然和Spring契合的非常完美,

同時,在設計之初,Spring MVC就參照了其他MVC框架的優缺點(包括Struts),所以用起來非常爽,因此,在MVC框架領域,Spring MVC大有一統天下的趨勢,

因此現在,很多公司,老的Struts專案還在維護,但新的專案開發,更多轉向了Spring MVC,因此,如果你是Java新手,正在學習中,我的建議是:

“不要再學習Struts了,從Spring MVC開始吧!”

Hibernate

Hibernate作為老牌的OR映射框架,功能非常強大,涵蓋面非常廣,但這既是它的優點,同時也成為它的“負擔”,是開發人員“不能承受之重”,

Hibernate的設計初衷,是為了最大程度的解放程式員,完全隔離資料庫,實作徹底的OR映射,程式員甚至可以不寫一行SQL陳述句,單通過配置就能實作對資料庫的操作,

當然,為了實作這個目標,Hibernate也設計的非常復雜、非常精巧,就不可避免的帶來以下副作用:

  1. 學習成本高
  2. 配置復雜
  3. 調優困難

前兩點不難理解,單說“調優困難”,

因為Hibernate的設計目標是徹底的OR映射,徹底的隔離SQL陳述句,但必然會帶來一定的性能損失,大部分情況下,應用如果對性能不敏感,Hibernate也沒問題,但應用一旦對性能敏感,有SQL級別調優的需求,Hibernate的優點反而成為缺點,

雖然Hibernate也支持SQL級別的調優,但因為框架設計的過于復雜和精巧,這就需要開發人員對Hibernate理解的非常透徹,這就帶來了更高的學習成本,

而現在最流行的MyBatis,作為一個“混合式”,輕量級OR映射框架,既繼承了Hibernate的優點,同時也吸取了他的教訓,在支持配置的同時,又能接觸SQL,從而帶來了更多靈活性(包括除錯、優化),

當前,在實際開發中,Hibernate使用的越來越少了,大家更偏愛MyBatis這種輕量級框架,所以,對后來學習者,我的建議是:

“不需要再學習Hibernate了,學MyBatis就夠了,”

Servlet(要精通)

當然,現在不會有任何公司,再用純粹的Servlet來時實作整個Web應用,而是轉向一些更高級的技術(例如各種MVC框架),因此,會給人一種錯覺:Servlet已經過時,后來者就不需要再學習了,

在這里,我可以非常負責任的說:這種觀點是極端錯誤,極端不負責任的,

Servlet不僅要學,而且要學深,學透,

當前,Servlet雖然不再是一個主流web開發技術,但依然是Java Web開發技術的基礎,是Java Web容器的基石,是行業標準,而現在流行的各種MVC框架(包括SpringMVC),在最底層,還是以 Servlet為基礎的,

為此,我畫了一個簡單的圖(不準確,會意即可):

對于自學Java的人來說,如何系統的,全方面的學習Java?

所以,如果你想要徹底掌握某個MVC框架,則必須徹底理解Servlet,

而且,Servlet作為一個基礎設施,精通它,不僅有助于理解各種MVC框架,即使Servlet本身,也有很多實用價值,

如果你深刻理解了Servlet的生命周期,就可以在底層做很多事情,譬如在Request進來的時候,進行攔截,進行權限的判定,也可以在Response發出的時候,進行攔截,統一檢查、統一附加,

所以,如果你正在學習Java,對Servlet,我的建議是:

“Servlet不僅要學,而且要學深,學透,”

其他

目前在國內,Java更多是作為web后端技術出現的,因此在實際學習中,很多技術就不符合“國情”,學習的現實意義不大,下面我就簡單列舉下,

1.Applet

作為頁面插件技術,不用多說,連flash都快被淘汰了,更無論從未流行的applet,

2.Swing

作為桌面UI框架,且不說本身設計的咋樣,現實開發中,我接觸的桌面應用,要么用C++(例如MFC),要么用C#(Winform、WPF),所以,Swing就沒有學習的必要了,

3.JDBC

作為較低層的資料庫基礎設施,JDBC被很多框架(例如MyBatis)支持,但在實際開發中,程式員即使不了解也無大礙,因此,雖然我不能建議你放棄JDBC學習,但如果你時間有限,完全可以把它的優先級排低一點,

4.XML

XML現在還在廣泛應用,但作為一個web資料傳輸格式,正在逐漸被JSON替代,所以,對Java后端學習來說,XML簡單了解即可,至于龐雜的XML操作API(例如XPath),完全不必學習,將來真要用到,再查也不遲,

3.非科班程式員如何補充基礎知識

非科班程式員,入了行,該如何繼續提升自己?

我是科班出身,大學也算努力,系統的掌握了計算機知識,迄今為止,也作業了將近20年,但老實說,無論是從在實際開發中,還是個人成長,回頭看,大學學習的很多課程,其中有很多,要么“用處”不大,要么完全可以換個方式,更高效的學習,

其中的原因,一方面是實際開發更關注知識的“實用”,另一方面,我們的大學教學也確實與產業有點脫鉤,

因此,本文,我就從實用出發,簡單介紹下那些領域的知識有很大的學習必要性,以及如何有重點的學習,

資料結構

毫無疑問,資料結構對一名程式員來說非常重要,不是有句話說“程式 = 資料結構 + 演算法”,從某個角度看,這種說法即使現在依然成立,這也說明資料結構的重要性,

但大部分的資料結構課程,關注的重點都在如何從數學上實作一個資料結構(例如堆疊、鏈表),這從研究上來說,沒有錯,

但在實際開發中,大部分主流語言(例如Java、C#)都已經內置了常用資料結構,而且即使沒有內置的,我們也常可以在第三方庫中找到現成的實作,而且這些實作,大都經過實踐檢驗,無論是穩定性還是性能都有保證,

也就是說,對大部分程式員來說,在實際開發中,很難有需求從頭實作一個資料結構,因此,就完全沒必要像科班生那樣,從數學源頭來學習資料結構,而只需做到下面幾點:

  1. 熟悉常用資料結構的概念(例如陣列、堆疊、鏈表、Map等),
  2. 了解常用資料結構不同實作的差異(例如ArrayList和LinkList的差異),
  3. 關注常用資料結構的外圍演算法(例如如何對List和Map進行查找),
  4. 關注資料結構使用中容易出錯的地方(例如是否執行緒是否安全等),

當然也完全沒必要閱讀大部頭的著作,而只需了解關注的重點是什么,然后再到網上搜索專題文章學習即可,至于關注的重點,可以參考《xxx面試大全》中的資料結構章節,

演算法

這個要具體問題具體分析了,以我接觸的領域來說,大部分普通的業務系統都不會涉及到太復雜的演算法,因此就沒必要專門在演算法上投入時間,

但在一些特殊的領域,如果演算法跟不上,可能“寸步難行”,例如圖形處理領域,無論是影像的變化還是增強,無一例外都要用到矩陣變換,因此就必然涉及到線性代數的內容,順藤摸瓜,往縱深學,就必然會牽出更多的東西,

因此,對非科班生(尤其是數學不夠好的),對演算法學習我是持“勸退”態度的,因為,從職業發展來說,這實在是一條太“曲折”的路線,

一方面,目前的開發越來越趨專業化,演算法一般由專門的演算法團隊負責,普通軟體工程師只負責演算法轉換,

以我為例,雖然是科班出身,也系統的學習過演算法,但也常有力有不逮的時候,復雜的演算法既實作不了,甚至是理解不了,很多時候,我干脆就不做實作,直接請演算法工程師告訴我思路,甚至是偽代碼,而我負責轉化為正式代碼(例如Java),實踐證明,這種做法不僅是可行的,而且也是高效的,正所謂“術業有專攻”,

另一方面,人的精力是有限的,你完全可以把精力投入到自己更擅長的方面,例如設計、產品、架構上,從而取得“差異化”的成功,

當然,如果你“心氣”很高,一定要在演算法上有所作為,我也可以推薦你兩本書:

  1. 《演算法導論》
  2. 《數學之美》

這些都是我讀過,受益良深的作品,

設計模式

設計模式,我認為是初中級程式員,向高級程式員提升的關鍵點,

在實踐中,我見過太多程式員,前期沖勁十足,但后繼乏力,最終泯然于眾生,我不敢說所有的人如此,但有不少都是吃了設計模式的虧,

在作業的前幾年,大部分程式員都是處于熟悉語言層面的階段,也就是處于“技”的階段,這個階段,如果人還算靠譜,大概在2到3年就會過去,接下來就要進入“術”的階段,在編程領域,“術”的最典型代表就是“設計模式”,因此,設計模式的重要性再怎么強調都不為過,

要學習設計模式,最經典的讀物依然是GOF的《設計模式:可復用面向物件軟體的基礎》,精煉、深刻,沒有一句廢話,但這本書對初學者來說,讀起來太艱澀,一方面是作者極度追求語言的凝練,一方面代碼是用C++描述的,因此,我推薦大家閱讀《Head First設計模式》,生動有趣,而且是用Java描述的,

但是,如果精力允許,我還是建議你一定要把GOF的《設計模式:可復用面向物件軟體的基礎》閱讀一下,而且要不止一遍的讀(我就是),這本書絕對常讀常新,

當然,學習設計模式,不僅要讀書,更要從實踐中學習,例如學習Spring框架的程序,如果你有思考,就會發現其中有太多設計模式可供借鑒,

學習設計模式,就是從實踐到理論,然后再從理論到實踐,反復實踐,反復思索,反復總結的程序,當然,這也是從一個“碼農”轉變成“工程師”的程序,

軟體工程

實作一個軟體系統的程序,不僅只有編碼,還涉及到專案安排,團隊協調等一系列非技術因素,而作為一名程式員,如果想往上更進一步,獨當一面,成為team leader或者開發經理等管理職務,則軟體工程一定要跟上,

當然,軟體工程這么多年也一直在進步,從原來的瀑布開發,到現在流行的敏捷開發,但無論怎么變,有些經典的東西還是不變的,下面我就推薦幾本我認為現在依然值得深讀的書:

  1. 《人月神話》
  2. 《人件》
  3. 《Scrum敏捷軟體開發》

當然,關于軟體工程,最好的學習方法依然是觀察,觀察你所在的團隊、所在的公司是如何處理工程問題,然后思索,閱讀,最終形成自己的方法觀,

架構 & 設計

寫出一個好程式,有幾個維度,從下到上,也是一個程式員逐步升級的程序,

第一階段,首先要保證基本功扎實,最簡單的說,要做到語法熟練、基本框架熟練,成為一個功夫精熟的“碼農”,

第二階段,從“技”到“術”,從“碼農”到“工程師”,這個階段的關鍵技術是設計模式,在區域上,不僅追求實作功能,更關注實作的好,關注功能之外的維度,例如健壯性、低耦合、可擴展等指標,對主流框架(例如Spring),不僅會用,更有深刻的理解,

第三階段,從“術”到“道”,

這個階段,不僅在區域上追求一個模塊的好壞,而且還要從整個系統層面去掌控程式,例如保證整個程式不出現系統腐敗,如何安排資源的優先級等,這個時候就不是單一的維度,單一的技術能夠保證了,

經常有朋友問我是如何成為一名架構師的,很難用一句話來回答,

我可以路線鮮明教你如何成為一名優秀的軟體工程師,但至于如何成為一名架構師,我想除了努力,運氣肯定也很重要,但無論如何,有機遇,不是還得有準備嘛?

作為一名架構師,所靠的肯定不是單一的維度,也不是但靠純粹的讀書能獲得的,但就我來說,有些經典書的閱讀,確實給我日常的作業帶來了巨大的幫助,下面我就推薦給你:

  1. 《代碼大全》、
  2. 《重構:改善既有代碼的設計》
  3. 《設計原本》
  4. 《大型網站技術架構核心原理與案例分析》

作為一名程式員,從技術菜鳥到大拿的路徑有很多,其中最核心的因素就是堅持和努力,學習的程序,就好像登山的程序,以我的經驗,大概有80%的人在攀登的程序中,會因為這樣那樣的原因而掉隊,

但無論如何,我相信,只要目標明確,努力加堅持,即使是一個非科班生,也完全可以登頂,

4.Java學習的一些補充建議

關于Spring Boot

Spring Boot是目前學習和應用的熱點,所以就有不少人說:“Spring和Spring MVC已經過時,不需要再學習了”,

在我看來,上面的觀點是極端錯誤和不負責任的,

從設計目標來說,Spring Boot只是實作了Spring的自動化配置,降低了專案搭建的復雜度,

從技術上說,Spring Boot的底層依然是Spring的核心機制,包括IOC、AOP,以及實作者 - Spring容器,所以,Spring Boot作為一個承載者,如果承載的是web專案,Spring MVC該怎么作業,還是怎么作業,

與“傳統”程式不同,Spring應用主要通過配置、注解,然后由Spring容器統一裝配運行,因此,如果程式員不能對底層機理做到“了然于胸”,則對整個系統的運行邏輯必然是“云里霧里”,

因此,在實際專案中,Spring系統一旦出了問題,許多“半吊子”程式員就會感到不知所措,為了快速“解決”問題,只得在Spring配置上胡亂折騰,所以到最后,很多Spring程式(包括業界著名公司)都被改的面目全非,腐敗不堪,充斥著各種冗余和沖突,

而Spring Boot雖然簡化了Spring配置,但同時也使程式離Spring本質越來越遠,整個程式的運行邏輯更加“云里霧里”,一旦出了問題,更加令人不知所措,

所以,從程式的健康出發,從程式員的職業發展出發,Spring Boot的開發者,反而更有必要掌握Spring的底層原理,正所謂“無真相不自由”,

而且,以我的經驗,如果你扎扎實實從Spring基礎一路走來,到了Spring Boot這里,也就是“臨門一腳”的問題,因此,學習Spring,最“正”的路徑依然如下:

Spring -> Servlet -> Spring MVC -> Spring Boot

JPA與Hibernate

JPA作為一個持久化規范,僅定義了OR映射的規范(包括一系列注解),但本身并沒有具體的實作,

在實際應用中,JPA的具體實作既有Hibernate,也可以通過spring和把jpa和Mybatis結合起來,但因為Hibernate的高可配性,因此從概念設計上來說, Hibernate對JPA的實作顯得更加“自然”,

但是,無論是業界還是我本人,偏愛Mybatis的原因和JPA關系不大,關鍵是因為Hibernate相對不夠靈活,從而帶來的高學習成本和調優成本,

當然,毫無疑問,Hibernate是一個非常優秀的框架,至于你所在的團隊是否選擇它,肯定是綜合考量的結果,其中既包括團隊的技術現狀(例如是否有Hibernate大牛),也包括專案的規模,及靈活性需求等,

而在其他文章中,我對Hibernate的觀點,主要是針對高效學習來講的,畢竟人的精力是有限的,

關于大資料

前面的兩篇文章,面向的主要是Java web開發者,

當然,Java開發,除了Web,還有大資料等方向,雖然都是學習Java,但內容肯定有所偏重,這里我就簡單闡述下,以免對其他方向(例如大資料)的學習者有所誤導,

做大資料開發,無論是做Hadoop的Map Reducer,還是Storm的topology(拓撲),最常見的實作方式還是Java,從這一點來說,對Java基礎知識的學習,大家都是一樣的,

但差別在是否要學習Spring?這決定于你對自己的定位!

如果你把僅自己定位在資料處理上,只需撰寫Map Reducer或topology,那么你完全可以不學習Spring,

但是,一個完整的大資料系統,必然是一個綜合系統,其中包括系統配置、資料的收集、傳輸、存盤、展示等子系統,而如何把這些子系統整合成一個綜合系統,則是Spring的專長,這也是JavaEE面臨的核心問題,

因此,從系統開發角度來說,大資料開發者依然應該學習Spring,只不過從優先級上來說,完全可以把Spring往后排一下,

5.如何閱讀Spring原始碼

因為Spring的源代碼量非常大,如果像閱讀小說一樣,一行不拉的讀,是不現實的,所以,現實,而且有用的做法,是只閱讀核心代碼,

至于其他邊支代碼,如果通讀,一則不現實,二則沒有必要,

但因為Spring復雜,且設計精妙,初學者剛開始閱讀,必然會面比較茫然,不知從那里入手,而我的做法,有一下幾個關鍵點:

1.先掌握Spring的基本用法,

在閱讀Spring原始碼之前,首先要掌握Spring的基本用法,否則就找不到基本的出發點,

此時,你肯定不能完全理解Srping的運行機制,但隨著使用的熟練,一則積累了經驗,二則肯定也會有很多疑問,這不要緊,反而是好事,

隨著學習的深入,你要有自己思考:如果某個機制(例如IOC),由你來設計,該會如何實作?

2.寫幾個典型的Spring Demo

因為你的目的是閱讀Spring原始碼,所以如果一開始,就閱讀相對高階的SrpingMVC,需要理解的東西太多,必然會茫然不知所措,

因為起始難度太大,缺乏正反饋,對很多人,甚至是直接就嚇退了,

所以,準備幾個好的Demo,這些Demo一定要層層深入,從而作為自己閱讀原始碼的出發點,

在內部培訓中,我寫過一個教程,名叫《Spring從入門到精通》,該教程總共包含5個Demo,由淺入深的順序如下:

  • 基本Java程式示例(SimpleJavaDemo)
  • 基本Spring示例(SimpleSpringDemo)
  • Spring自動織入示例(AutoWiredSpringDemo)
  • Spring自動掃描示例(AutoScanSpringDemo)
  • SpringMVC示例(SpringMVCDemo)

大家可以根據個人的情況,也撰寫出自己的Demo庫,

3.邊除錯,邊閱讀

例如對下面這行最普通的Spring代碼:

對于自學Java的人來說,如何系統的,全方面的學習Java?

直接用Maven下載原始碼,然后在Eclipse中Debug進去,此時,就像你平時閱讀同事的原始碼一樣,帶著疑問,帶著猜測,閱讀的程序,邊驗證,邊調整,總重形成體系的思路,

記著,因為Spring原始碼復雜,且繼承體系深,所以一定要邊閱讀,邊記筆記,邊畫圖,例如下面就是我畫過的一個圖(從Eclise中截取):

對于自學Java的人來說,如何系統的,全方面的學習Java?

很重要的一點,在閱讀Spring原始碼前,一定要先有自己的想法:如果這個東西(例如經典的getBean()方法)由你要設計,會怎么做,然后帶著想法,跟(debug)進去,不斷驗證,不斷調整,

4.不需面面俱到,只抓重點,

因為Spring原始碼巨大,對閱讀者來說,也不是都有價值,所以一定要抓住重點,

要時刻記住閱讀的初心:不是為了閱讀而閱讀,而是為了深刻理解Spring,從而自由運用,所謂“無真相不自由”,所以只閱讀核心的,對自己有用的(這個因人而異),下面是我當年閱讀時的讀書筆記提綱,貼出來供大家參考:

對于自學Java的人來說,如何系統的,全方面的學習Java?

5.Spring閱讀的收益

通過閱讀Spring原始碼,至少能有以下識訓:

#.精通Java

因為 Spirng框架本身,就是對Java最“精妙”的運用,我敢保證,在閱讀Spring的程序,除了發現很多Java的“新”特性外,你也能學會“大神”們,是如何正確且高效的撰寫Java程式,

#.學習設計

Spring框架本身就是一個“設計良好”的典型,其中大量運用到經典的設計模式,例如“觀察者模式”、“單例模式”等,因此學習Spring的程序,就是學習設計的程序,

#.深刻理解Spring用法

所謂“無真相自由”,等你學習了Spring原始碼后,我敢保證,你回頭再來看自己,或別人原來寫的Spring程式,肯定會發現諸多“錯誤”,包括代碼的冗余,沖突等,

.最后

如果你是一個初學者,剛開始閱讀Spring原始碼,一定會感覺特別困難,因為其中涉及太多新東西,但這正說明,Spring原始碼是一個寶庫,

咬咬牙,扛過去,你的技術層次就會躍上一個新的臺階,甚至是質的飛躍,所謂:

“會當凌絕頂,一覽眾山小,”

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/384158.html

標籤:其他

上一篇:3年測驗經驗跳槽到騰訊,開口就要15k?一問8k都不值...

下一篇:女程式員被瞧不起?92年程式媛發帖曬薪資,網友:老妹你可以了

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more