Java 后端自學(xué)之路
文章轉(zhuǎn)載自:http://objcoding.com/2018/02/07/javaweb-learning/
最近有些網(wǎng)友問(wèn)我如何自學(xué) Java 后端,還有些是想從別的方向想轉(zhuǎn)過(guò)來(lái)藕筋,但都不太了解 Java 后端究竟需要學(xué)什么纵散,究竟要從哪里學(xué)起,哪些是主流的 Java 后端技術(shù)等等隐圾,導(dǎo)致想學(xué)伍掀,但又很迷茫,不知從何下手暇藏。我就以過(guò)來(lái)人的經(jīng)歷硕盹,寫在這篇博客里,不一定都對(duì)叨咖,但都是我根據(jù)自己的經(jīng)歷總結(jié)出來(lái)的瘩例,供你們的參考啊胶。
Java 基礎(chǔ)
Java 是一門純粹的面向?qū)ο蟮木幊陶Z(yǔ)言,所以除了基礎(chǔ)語(yǔ)法之外垛贤,必須得弄懂它的 oop 特性:封裝焰坪、繼承、多態(tài)聘惦。此外還有泛型某饰、反射的特性,很多框架的技術(shù)都依賴它善绎,比如 Spring 核心的 Ioc 和 AOP黔漂,都用到了反射,而且 Java 自身的動(dòng)態(tài)代理也是利用反射實(shí)現(xiàn)的禀酱,這里我特意寫了一篇?Java動(dòng)態(tài)代理原理分析炬守。此外還有 Java 一些標(biāo)準(zhǔn)庫(kù)也是非常常見,比如集合剂跟、I/O减途、并發(fā),幾乎在 Web 開發(fā)中無(wú)處不在曹洽,也是面試經(jīng)常會(huì)被問(wèn)到的鳍置,所以在自學(xué) Java 后端之前,不妨先打好這些基礎(chǔ)送淆,另外還有 Java8 的一些新特性税产,也要重點(diǎn)關(guān)注,比如 Lambda 表達(dá)式偷崩、集合的 Stream 流操作砖第、全新的 Date API 等等,關(guān)于新特性环凿,我也寫了幾篇關(guān)于這方面的博客梧兼,請(qǐng)自行找吧,就不貼出來(lái)了智听。
關(guān)于書籍推薦羽杰,我是不建議初學(xué)者一開始就拿著「Java 編程思想」啃的,因?yàn)楫?dāng)初我就是那個(gè)當(dāng)天下午決定自學(xué) Java到推,晚上就抱著這本書啃的人考赛,說(shuō)實(shí)話,我當(dāng)時(shí)真的不懂它在說(shuō)啥莉测,因?yàn)槲覜](méi)有一點(diǎn)的面向?qū)ο笳Z(yǔ)言編程的基礎(chǔ)颜骤,而這本書又寫得太博大精深了,在當(dāng)時(shí)的我來(lái)說(shuō)捣卤,完全是天書忍抽,但是我認(rèn)為它仍然是 Java 界的圣經(jīng)八孝,每讀一次都有所收獲。我在這里推薦你們一開始先看「Java 核心技術(shù)」鸠项,這本書講得比較通俗易懂干跛,初學(xué)者比較能接受。
關(guān)于視頻推薦祟绊,我當(dāng)初就是聽某客的畢向東老師講的 Java 基礎(chǔ)教程楼入,畢老師講的實(shí)在是太生動(dòng)有趣了,不知不覺(jué)把我?guī)нM(jìn) Java 的坑里無(wú)法自拔牧抽,有時(shí)候我會(huì)聽他視頻時(shí)笑出聲來(lái)嘉熊,也許是我那段自學(xué)階段最有趣的時(shí)刻了。
數(shù)據(jù)庫(kù)
關(guān)于 sql 方面:SQL 教程扬舒、MySQL 教程
我是了解了一些基礎(chǔ)語(yǔ)法之后阐肤,就直接跟著視頻的老師做一些表操作實(shí)戰(zhàn)練習(xí)了,比如單表查詢呼巴、多表查詢等。我建議學(xué) sql 切勿眼高手低御蒲,需多加練習(xí)衣赶,不要只看懂了就行,因?yàn)楣ぷ髦袑懙靡皇趾?jiǎn)練的 sql 是非常重要的厚满。在這里我說(shuō)下我在項(xiàng)目一直秉承著 sql 語(yǔ)句是能避免多表查詢就避免多表查詢府瞄,能夠分開多條語(yǔ)句就分開多條語(yǔ)句,因?yàn)檫@里涉及到多表查詢性能和數(shù)據(jù)庫(kù)擴(kuò)展的問(wèn)題碘箍。
關(guān)于 JDBC 方面:JDBC 教程遵馆、?JDBC 獲取連接對(duì)象源碼分析
你需要弄懂 JDBC API 的用法,其實(shí)它只是一組規(guī)范接口丰榴,所有數(shù)據(jù)庫(kù)驅(qū)動(dòng)只要實(shí)現(xiàn)了 JDBC货邓,那么我們就可以通過(guò)標(biāo)準(zhǔn)的 API 調(diào)用相應(yīng)的驅(qū)動(dòng),完全不用知道驅(qū)動(dòng)是怎么實(shí)現(xiàn)的四濒,這就是面向接口編程的好處换况。而且對(duì)于 JDBC 我是直接看視頻去理解的,跟著視頻做了一個(gè)基于 Apache Dbutils 工具做了一個(gè)具有事務(wù)性的小工具盗蟆,我特意用思維導(dǎo)圖總結(jié)了一下:
Web 基礎(chǔ)
曾經(jīng)開源中國(guó)創(chuàng)始人紅薯寫了一篇文章「初學(xué) Java Web 開發(fā)戈二,請(qǐng)遠(yuǎn)離各種框架,從 Servlet 開發(fā)」喳资,我覺(jué)得他說(shuō)的太對(duì)了觉吭,在如今 Java 開發(fā)中,很多開發(fā)者只知道怎么使用框架仆邓,但根本不懂 Web 的一些知識(shí)點(diǎn)鲜滩,其實(shí)框架很多伴鳖,但都基本是一個(gè)套路,所以在你學(xué)習(xí)任何框架前绒北,請(qǐng)把 Web 基礎(chǔ)打好黎侈,把 Web 基礎(chǔ)打好了,看框架真的是如魚得水闷游。
關(guān)于 Http 協(xié)議峻汉,這篇文章就寫得很清楚:Http協(xié)議
關(guān)于 Web 基礎(chǔ)這方面數(shù)據(jù)推薦,我當(dāng)時(shí)是看的是「Tomcat 與 Java Web 開發(fā)技術(shù)詳解」脐往,很詳細(xì)地講解了整個(gè) Java Web 開發(fā)的技術(shù)知識(shí)點(diǎn)休吠,但現(xiàn)在看來(lái),我覺(jué)得里面講的有一些技術(shù)確實(shí)有點(diǎn)老舊了业簿,不過(guò)可以了解一下 Java Web 開發(fā)的歷史也是不錯(cuò)的瘤礁。所以在 Web 基礎(chǔ)這方面我都是看某客的崔老師講的「超全面 Java Web 視頻教程」,講得很詳細(xì)很生動(dòng)梅尤,還有實(shí)戰(zhàn)項(xiàng)目柜思!
關(guān)于 JSP,你只要了解它其實(shí)就是一個(gè) Servlet 就行了巷燥,關(guān)于它的一些標(biāo)簽用法赡盘,我認(rèn)為可以直接忽略,因?yàn)楝F(xiàn)在互聯(lián)網(wǎng)幾乎沒(méi)哪間公司還用 JSP缰揪,除了一些老舊的項(xiàng)目≡上恚現(xiàn)在都是流行前后端分離,單頁(yè)應(yīng)用钝腺,后端只做 API 接口的時(shí)代了抛姑,所以時(shí)間寶貴,把這些時(shí)間重點(diǎn)放在 Servlet 規(guī)范上面吧艳狐。
關(guān)于 Tomcat定硝,它是一個(gè) Web 容器,我們寫的后端項(xiàng)目都要部署到Web容器才能運(yùn)行毫目,它其實(shí)是一個(gè)遵循 Http喷斋,通過(guò) Socket 通信與客戶端進(jìn)行交互的服務(wù)端程序:Tomcat結(jié)構(gòu)及處理請(qǐng)求過(guò)程
Web 主流框架
Java Web 框架多如牛毛,等你有一定經(jīng)驗(yàn)了蒜茴,你也可以寫一個(gè) Web 框架星爪,網(wǎng)上很多說(shuō) Spring、Struts2粉私、Hibernate 是 Java 三架馬車顽腾,我只想說(shuō),那是很久遠(yuǎn)的事情了,我嚴(yán)重不推薦 Struts2抄肖、Hibernate久信,相信我,一開始只需要上手 Spring漓摩、SpringMVC裙士、Mybatis 就可以了,特別是 Spring 框架管毙,其實(shí) Spring 家族的框架都是很不錯(cuò)的腿椎。
但是提醒一點(diǎn)就是,千萬(wàn)不要沉迷于各種框架不能自拔夭咬,以會(huì)多種用法而沾沾自喜啃炸,導(dǎo)致知其然而不知其所以然。
Spring其核心思想就是 IOC 和 AOP:
SpringMVC 它的思想是全部請(qǐng)求統(tǒng)一用一個(gè) Servlet 去做請(qǐng)求轉(zhuǎn)發(fā)與控制卓舵,這個(gè) Servlet 叫 DispatcherServlet:
Mybatis 它可實(shí)現(xiàn)動(dòng)態(tài)拼裝 sql南用,避免了幾乎所有的 JDBC 代碼和手動(dòng)設(shè)置參數(shù)以及獲取結(jié)果集:
Web 框架進(jìn)階
使用了 SSM 框架后瞬浓,你會(huì)覺(jué)得框架也不過(guò)這么回事葛碧,如果你對(duì) Spring 有過(guò)大概了解捻浦,你也會(huì)產(chǎn)生想寫一個(gè)「山寨版」Spring 的心思了来破,一個(gè)輕量級(jí) Web 框架主要具備以下功能:
可讀取用戶自定義配置文件,并以此來(lái)初始化框架惠猿;?
具備 Bean 容器喂柒,管理項(xiàng)目的類的對(duì)象生命周期车胡;?
具備依賴注入砚嘴,降低類之間的耦合性十酣;?
具備 AOP 功能涩拙,使項(xiàng)目可進(jìn)行橫向編程际长,可不改變?cè)写a的情況增加業(yè)務(wù)邏輯;?
具備 MVC 框架模式兴泥。?
其實(shí)除了 SSM 之外工育,Web 框架可謂是百家齊放,其中以 Spring 全家桶最為耀眼搓彻,在這里我極力推薦兩個(gè) Spring 家族框架:SpringBoot 和 SpringCloud如绸。
SpringBoot 彌補(bǔ)了 Spring 配置上的缺點(diǎn),再也不用為繁雜的 xml 費(fèi)勁精力了旭贬,堪稱是 Java 后端開發(fā)的顛覆者怔接,推薦書籍「Java EE 開發(fā)的顛覆者:SpringBoot實(shí)戰(zhàn)」
SpringBoot 構(gòu)建 web 項(xiàng)目
SpringCloud 是一個(gè)微服務(wù)架構(gòu),能夠?qū)㈨?xiàng)目按照業(yè)務(wù)分成一個(gè)個(gè)微服務(wù)稀轨,每個(gè)微服務(wù)都可獨(dú)立部署扼脐,服務(wù)之間互相協(xié)調(diào)。當(dāng)一個(gè)項(xiàng)目越來(lái)越大時(shí),隨之而來(lái)的是越來(lái)越難以維護(hù)瓦侮,此時(shí)將項(xiàng)目拆分成若干個(gè)微服務(wù)艰赞、單獨(dú)維護(hù)、單獨(dú)部署肚吏,也可以降低項(xiàng)目不同業(yè)務(wù)間的耦合度方妖。推薦書籍「Spring Cloud 與 Docker 微服務(wù)架構(gòu)實(shí)戰(zhàn)」,這本書將 Docker 與微服務(wù)完美地結(jié)合在一起罚攀,堪稱完美党觅!
我寫的有關(guān)于 Spring Cloud 的博客:
SpringCloud微服務(wù)架構(gòu)之服務(wù)注冊(cè)與發(fā)現(xiàn)
SpringCloud微服務(wù)架構(gòu)之服務(wù)消費(fèi)者
SpringCloud微服務(wù)架構(gòu)之?dāng)嗦菲?/a>
SpringCloud微服務(wù)架構(gòu)之服務(wù)網(wǎng)關(guān)
其它技術(shù)
Redis:一個(gè)高性能的 key-value 數(shù)據(jù)庫(kù),當(dāng)有并發(fā)量很高的請(qǐng)求時(shí)坞生,將數(shù)據(jù)緩存在 Redis 中仔役,將提高服務(wù)器的響應(yīng)性能,大大減輕數(shù)據(jù)庫(kù)的壓力是己。
Git:世界上最先進(jìn)的分布式版本控制系統(tǒng)又兵,建議所有初學(xué)者從命令行開始使用 Git!
關(guān)注 stormzhang 公眾號(hào)「googdev」卒废,回復(fù)「github」沛厨,即可免費(fèi)獲取一份 GitHub 教程電子書,我覺(jué)得寫得很不錯(cuò)摔认。
Maven:一個(gè)用于構(gòu)建項(xiàng)目的工具逆皮,將項(xiàng)目間的依賴通過(guò) xml 完美地組織到一起,可通過(guò)編譯插件將項(xiàng)目編譯成字節(jié)碼文件参袱。還有類似的 Gradle 也是不錯(cuò)的選擇电谣。
Linux:至少要求常用的命令會(huì)用,能夠在 linux 環(huán)境下部署項(xiàng)目抹蚀。
Docker:簡(jiǎn)直是項(xiàng)目部署神器啊剿牺,來(lái)不及解釋了,看我 Docker 系列博客环壤,開啟 Docker 之旅吧晒来!推薦書籍「Docker 技術(shù)入門與實(shí)戰(zhàn)」,中國(guó)首部 Docker 著作郑现!
開發(fā)工具
工欲善其事湃崩,必先利其器,以下是我推薦的一些開發(fā)工具:
Intellij IDEA:Java 開發(fā)最好的 IDE接箫,這個(gè)是公認(rèn)的攒读,我一開始是用 Eclipse 的,后來(lái)用了 Intellij IDEA辛友,才發(fā)現(xiàn) Eclipse 就是一坨屎薄扁,所以我以過(guò)來(lái)人勸你們不要使用 Eclipse,直接 Intellij IDEA!
Iterm2:macOS 最好用的終端泌辫!
Chrome:人生苦短随夸,請(qǐng)用 Chrome,來(lái)不及解釋了震放,快上車宾毒!
Postman:很好用的一個(gè)接口調(diào)試工具。