課程內容分為三個模塊
基礎模塊:
- 技術崗位與面試
- 計算機基礎
- JVM原理
- 多線程
- 設計模式
- 數據結構與算法
應用模塊:
- 常用工具集
- 常用框架
- 緩存
- 隊列
- 數據庫
綜合模塊:
- 系統架構設計
- 微服務架構
- 容器化
換工作面臨問題
能力不錯,卻總被忽略
-
不知道簡歷怎么准備
- 工作年限
- 美觀度
- 多分簡歷
-
不知道面試官考什么
- 社交門戶側重於大規模並發場景的應用和架構能力
- OTO行業側重於綜合能力考察
- 金融更喜歡邏輯縝密,對高可用安全領域有經驗的候選人
- 校招更多對基礎知識和邏輯思維方面的考察,以培養潛力考察為主
- 初中級工程師則需要多關注知識的廣度,基礎知識的應用
- 高級資深工程師需要深入理解基本原理,以綜合能力考察為主
- 沒有get到面試官的考察意圖。如:問到是否使用某框架,實際是是問該框架的使用場景,有什么特點,和同類可框架對比一系列的問題。
-
不知道如何提升晉級?
- 學習首先有個框架
課程特色
- 全盤匯總:Java知識體現精細梳理
- 特近實戰:面試官親自教你拿Offer
- 潛規則:揭秘技術面試加分&潛規則
- 權威性:拉勾40W技術崗位大數據支持
課時1:技術人職業發展路徑
1.1 工程師發展路徑
技術序列:技術攻堅、架構知識、專業知識
- 工程師
- 高級工程師
- 資深工程師
- 技術專家
- 高級技術專家
1~3年內從工程師到高級工程師發展,夯實基礎,重點提高工作基礎能力,培養技術的深度和廣度,對不同方向的新技術保持強烈的好奇心和學習心
3年以上資深工程師需要重點配音技術攻堅能力,疑難問題的排查,大型項目的工程拆分,技術品牌的塑造。具體工作包括,原理實現,注重框架能力的培養,大規模高並發場景,高可用可擴展措施和方案,業務的抽象和架構能力
管理序列:團隊管理、項目管理、溝通協作
- 工程師
- 高級工程師
- 技術經理
- 技術總監
- 高級技術總監
偏向於團隊把控,需要讓團隊形成技術戰斗力,利用一切資源讓團隊完成作戰目標,做好團隊內和跨團隊溝通工作,在實際工作中這兩種並沒有明顯的邊界,例如做管理不表示遠離架構設計,技術專家也不是單兵作戰。這兩個方向的區分點在於工作方向的側重點不同。
面試訣竅示例:同過往的經驗來看,我對項目的整體規划、管理、推進比較感興趣,在任務協調溝通方面也有過比較突出的表現,所以我的職業規划是成為一名職業的技術經理,以管理方向為發展目標。
1.2 常見技術崗位划分
1.3 面試崗位選擇
公司&團隊
- 大公司核心業務(首選)
- 小公司核心業務(1~3年)
- 大公司邊緣業務(鍍金)
- 小公司邊緣業務(盡量不選)
崗位匹配度
匹配度與發展方向相吻合
1.4 常見面試流程
-
前置面試
- 電話面試
- 筆試
- 上機編程
-
技術一面
- 純技術面(首選算法,例如排序、)
- 偏重於基礎與實戰能力
- 面試官是未來的同組同事
-
技術二面
- 純技術面(項目能力、架構能力)
- 偏重算法、技術深度
- 面試官是未來直屬leader
-
技術三面
- 半技術面(架構能力、技術敏感度、職業規划)
- 架構能力與發展潛力
- 面試官是部門技術leader
-
HR面
- 非技術面
- 個人發展規划
- 價值觀與薪資
-
各級領導
- 一般非技術面
- 沒有原則性問題能都通過
1.5 面試前的准備工作
能力、心態、溝通
- 了解應試公司及崗位信息
- 系統復習基礎知識
- 對原公司負責的項目進行梳理總結
- 學習典型架構案例
- 閱讀常考考點源碼
- 針對性准備加分項
提前准備一份自我介紹,自己的技術特長和職業優勢
避免冷場,對於回答不上來的問題,提供解題思路,或者詢問面試官是否可以換一個問題
注意細節,坐姿、表情、觀察面試官反應
1.6 面試考察點
硬技能
- 基礎知識
- 項目經驗
- 架構能力
- 應用能力
軟實力
- 邏輯思維
- 溝通協作
- 管理推進
- 學習思考
- 培養潛力
1.7 四類硬技能
基礎知識
-
計算機基礎
- 網絡
- 操作系統
- 數據結構
- 算法
-
Java
- JVM
- 語言特性
- 多線程
項目經驗
- 項目描述
- 項目難點
- 項目問題
- 項目改進
應用知識
-
常用工具
- 排查類
- 協作類
- 保障類
- 系統類
-
常用框架
- Spring
- Netty
- Dubbo
- Motan
- Mybatis
- 隊列
- 數據庫
- 緩存
架構能力
微服務架構
- Docker
- ZK
- SC
- KBs
課時2:計算機與網絡基礎
2.1 知識點匯總
2.1.1操作系統(加粗為重點)
進程與線程
- 區別聯系:進程是資源分配的最小單位,線程是程序執行的最小單位;進程使用獨立的數據空間,線程共享進程的數據空間
- 線程調度:時間片輪轉調度、先來先服務調度、優先級調度、多級反饋隊列調度、高響應比優先調度
- 線程切換步驟:線程的上下文切換、線程切換的代價
-
Linux下的IPC(進程間通訊)
- Pipe
- MessageQueue
- 共享內存
- UnixSocket
- Signal
- Semaphore
- 協程
Linux常用命令
- awk
- top
- netstat
- grep
- less
- tail
死鎖
內存分頁管理於Swap
任務隊列於CPU Load
擴展知識點
- 內存屏障
- 指令亂序
- 分支預測
- CPU親和性(affinity)
- Netfilter於iptables
2.1.2 網絡知識(加粗為重點)
4/7層網絡模型
TCP協議
- 建立鏈接三次握手
- 關閉鏈接四次握手
- 報文狀態標志與鏈接狀態
- Nagel算法與ACK延遲
- Keepalive
- 滑動窗口與流量控制
UDP
- 非鏈接
- 非可靠傳輸
- 效率高
HTTP
-
協議
- Method
- Header
- Cookie
- UrlEncode
- 狀態碼
- HTTPS
- HTTP2
- 多路復用
- Stream
- 流量控制
- 服務端推送
- 頭部壓縮
QUIC(基於UDP,但是提供了基於UDP的可靠性保障)
- 避免前序抱阻塞(HOL阻塞)
- 零RTT建聯
- FEC前向糾錯
2.2 TCP詳解
TCP特點
- 基於鏈接(點對點)
- 雙工通信
- 可靠傳輸
- 擁塞控制
- 基於字節流而非報文(保證數據的可靠性和完整性)
TCP實現細節
- 8種報文狀態
- 滑動窗口機制
- KeepAlive
- Bagel算法
2.3 設計模式詳解
主要考察兩點
- 設計模式的實現
-
設計模式的使用場景(用來解決什么問題)
- 單例模式
- 工廠模式
- 代理模式
- 構造者模式
- 責任鏈模式
- 適配器模式
- 觀察者模式
- 其他模式
2.3.1 單例模式線程安全實現
- 靜態初始化(餓漢式)
- 雙重檢查(懶漢式)
- 單例注冊表
2.3.2 常用設計模式與應用場景
- 工廠模式:Spring如何創建Bean
- 代理模式:Motan服務的動態代理
- 責任鏈模式:Netty消息處理的方式
- 適配器模式:Slf4J如何支持Log4J
- 觀察者模式:GRPC是如何支持流式請求的
- 構造者模式:PB序列化中的Builder
2.4 Java基礎知識詳解
JUC
- ConcurrentXXX
- AtomicXXX
- Executor
- Caller&Future
- Queue
- Locks
版本差異新特性
動態代理與反射
數據類型
- 空間占用
- 基本數據結構
- 自動轉型與強制轉型
- 封箱與拆箱
常用集合
- HashMap
- ConcurrentHashMap
- ArrayList&LinkedList
- HashSet
- TreeMap
對象引用
- 強引用
- 弱引用
- 軟引用
- 虛引用
異常機制
擴展知識點
- SPI機制
- 注解處理機制
2.4.1 Map——知識點詳解
HashMap
- 數組加鏈表的實現方式
- 容量大小是2的冪次方
- 並發讀寫會有什么風險
ConcurrentHashMap
- 並發控制與分段鎖思想
- 1.8中的CAS自旋鎖
- 紅黑樹的啟用條件
2.4.1 Java版本特性
V 1.8
- Lambda表達式
- Stream API
- 方法引用
- 接口默認方法
- Metaspace替換PermGen
V 1.9-1.10
- 模塊系統
- 默認G1回收器
- 接口私有方法
- 局部變量推斷
- Graal編譯器
V 1.11
- ZGC
- 字符串API增強
- 內建HTTP Client
2.5 考察點和加分項
面試考察點
- 基本概念和基本原理
- 實現方式與使用姿勢
- 經常用到的知識點
- 實際應用中容易犯錯的點
- 與面試方向相關的知識點
加分項
- 知識點與典型的業務場景關聯
- 以反例來描述實際場景中誤用的危害
- 與知識點相關的優化點(例如在介紹TCP的建聯與斷連時最好能夠指出,出現timewait時可以調整系統參數加快鏈接的回收與復用)
- 與知識點相關的最新技術趨勢
- 在了解的前提下,盡量增加回答內容深度
2.6 真題
真題匯總——1
- 線程與進程的區別與聯系
- 從資源的占用,切換效率,通信方式回答
- 簡單介紹一下進程的切換過程
- 主要考察線程上下文的切換代價,要回答切換會保持寄存器、棧等線程相關的現場,需要由用戶態切換到內核態,最后知道可以通過vmstate命令查看上下文的切換狀況
- 你經常使用哪些Linux命令,主要用來解決什么問題?
- 為什么TCP建聯需要3次握手而斷連需要4次
- 為什么TCP關閉鏈接時需要TIME_WAIT狀態,為什么要等2MSL?
- 一次完整的HTTP請求過程是怎樣的
- DNS解析、TCP建聯、HTTP請求、HTTP相應
真題匯總——2
- HTTP2與HTTP的區別有哪些?
- 在你的項目中你使用過哪些設計模式?主要用來解決什么問題?
- Object中的equal和hashCode的作用分別是什么?
- final、finally、finalize的區別與使用場景
- 簡單描述一下java的異常機制
- 線上使用的哪個版本jdk,為什么使用這個版本(有什么特點)?
課時3:深入淺出JVM
3.1 知識點匯總
內存模型
- 程序計數器
- 方法區
- 堆
- 棧
- 本地方法棧
類加載器
- 雙親委派機制
- Boostrap類加載器
- Extension類加載器
- System類加載器
- 自定義類加載器
GC
-
分代回收
- 老年代
- 年輕代
- 持久代
-
回收器實現
- 穿行回收器
- 並行回收器
- CMS
- G1
性能調優
- JVM參數
-
性能分析工具
- MAT
- JMC
- JStack
- JStat
執行模式
- 解釋模式
- 編譯模式
- 混合模式
編譯器優化
- 公共子表達式的消除
- 指令重排
- 內聯
- 逃逸分析
- 方法逃逸
- 線程逃逸
- 棧上分配
- 同步消除
3.2 JVM的內存模型
3.2.1 JVM內存模型
線程獨占
- 棧(存儲局部變量表、操作棧、動態鏈接、方法出口等信息)
- 本地方法棧(native方法)
- 程序計數器
線程共享
- 堆(堆所有線程共享,分代管理)
- 方法區(類信息、常量、靜態變量,jdk1.7中的永久代和jdk1.8中的metaspace都是方法區的一種實現)
面試回答要點:
- 各部分功能
- 哪些是線程共享,哪些是線程獨占
3.2.2 JMM與內存可見性
Java內存模型,定義程序中變量的訪問規則。
在多線程進行數據交互時,例如線程A給一個共享變量賦值后由線程B來讀取這個值,線程A修改變量只修改在自己的工作內存區中,線程B是不可見的,只有從A的工作內存區寫回到工作主內存,B在從主內存讀取到自己的工作內存區才能進行進一步的操作。
由於指令重排序的存在,寫和讀的順序可能會被打亂,因此JMM需要提供原子性、可見性、有序性的保證。
3.3 Java類加載機制詳解
3.3.1 類的生命周期
加載:是文件到內存的過程,通過類的完全限定名查找此類字節碼文件,並利用字節碼文件創建一個Class對象;
驗證:驗證是堆文件類內容驗證,目的在於當前類文件是否符合虛擬機的要求,不會危害到虛擬機安全,主要包括四種:文件格式驗證、元數據驗證、字節碼、符號引用;
准備:准備階段是進行內存分配,為類變量,也就是類中由static修飾的變量分配內存並設置初始值,初始值是0或null,而不是代碼中設置的具體值,代碼中設置的值在初始化階段完成,另外也不包括final修飾的靜態變量,因為final變量在編譯時就已經分配;
解析:解析主要是解析字段、接口、方法,主要是將常量值中的符號引用替換為直接引用的過程,直接引用就是直接指向目標的指針或相對偏移量等;
初始化:最后是初始化,主要是完成靜態塊執行與靜態變量的賦值,這是類加載最后階段,若被加載類的父類沒有初始化,則先對父類進行初始化。
只有對類使用是才會初始化,初始化的條件包括訪問類的實例,訪問類的靜態方法和靜態變量的時候,使用Class.forName()反射類的時候,或者某個子類被初始化的時候。
3.3.2 類加載器
BootStrap ClassLoader
:啟動類加載器加載JAVA_HOME/lib
下的類
ExtClassLoader
:擴展加載器加載JAVA_HOME/lib/ext
下的類
AppClassLoader
:應用加載器加載加載classpath
指定目錄下的類
除此之外,還可以自定義類加載器。
Java的類加載器使用雙親委派模式,雙親委派模型的工作過程是:
- 如果一個類加載器收到了類加載的請求,它首先不會自己去嘗試加載這個類,而是把這個請求委派給父類加載器去完成。
- 每一個層次的類加載器都是如此。因此,所有的加載請求最終都應該傳送到頂層的啟動類加載器中。
- 只有當父加載器反饋自己無法完成這個加載請求時(搜索范圍中沒有找到所需的類),子加載器才會嘗試自己去加載。
很多人對“雙親”一詞很困惑。這是翻譯的鍋,,,“雙親”只是“parents”的直譯,實際上並不表示漢語中的父母雙親,而是一代一代很多parent,即parents。
雙親委派模式優勢:
采用雙親委派模式的是好處是Java類隨着它的類加載器一起具備了一種帶有優先級的層次關系,通過這種層級關可以避免類的重復加載,當父親已經加載了該類時,就沒有必要子ClassLoader
再加載一次。其次是考慮到安全因素,java核心api中定義類型不會被隨意替換,假設通過網絡傳遞一個名為java.lang.Integer的類,通過雙親委托模式傳遞到啟動類加載器,而啟動類加載器在核心Java API發現這個名字的類,發現該類已被加載,並不會重新加載網絡傳遞的過來的java.lang.Integer,而直接返回已加載過的Integer.class,這樣便可以防止核心API庫被隨意篡改。
3.4 常用GC算法介紹
3.4.1 分代回收
分代管理主要是為了方便垃圾回收,這樣做是基於兩個事實:
- 大部分對象很快都不在使用
- 還有一部分不會立即無用,但也不會持續很長時間
大部分對象在Eden區中生成,Eden區滿時,還存活的對象會在兩個Suivivor區交替保存,達到一定次數后對象會晉升為老年代。
老年代用來存放從年輕代晉升而來的存活時間較長的對象。
永久代主要用來保存類信息等內容。
3.4.2 垃圾回收算法
- 着色指針
- 讀屏障
- 並發處理
- 基於Region
- 內存壓縮(整理)
3.5 考察點和加分項
考察點
- 深入理解JVM內存模型
- 了解類加載機制
- 了解內存可見性
- 了解常用的GC算法實現和使用場景
- 能夠根據業務場景選擇合適JVM參數與GC算法
加分項
- 編譯器優化
- 問題排查經驗與思路
- JVM調優經驗與調優思路
- 了解最新的技術趨勢(例如:ZGC、Grraalvm)
3.6 真題
- 簡述描述一下JVM的內存模型
- 生命情況下會觸發FullGC
- Java類加載器由幾種,關系是怎樣的?
- 雙親委派機制的加載流程是怎樣的,有什么好處?
- 1.8為什么用Metaspace替換掉PermGen?Metasapce保存在哪里?
- 編譯期會對指令做哪些優化?(簡單描述編譯器的指令重排)
- 簡單描述一下volatile可以解決什么問題?如何做到的?
- 強制主內存讀寫同步以及防止指令重排序兩點
- 簡單描述一下GC的分代回收
- G1垃圾回收算法與CMS的區別有哪些?
- 對象引用有哪幾種方式,有什么特點?
- 強弱軟虛在四種引用以及在GC中的處理方式
- 使用過哪些JVM調試工具,主要分析哪些內容?
課時4:並發與多線程
4.1 知識點匯總
死鎖
- 競爭條件與臨界區
- 死鎖檢測與防止死鎖
-
殘剩條件
- 互斥
- 請求並保持
- 不可剝奪
- 循環等待
線程通信
- wait
- notify
- notifyAll
線程狀態轉換
- NEW
- RUNNABLE
- BLOCKED
- WAITING
- TIMED_WAITING
- TERMINATED
常用工具類(JUC)
- ConcurrentXXX
- AtomicXXX
- Executor
- Caller&Future
- Queue
- Locks
機制
- ThreadLocal
- Fork/Join
- Volatile
- Interrupt
同步與互斥
- Synchronized
-
Lock
- 鎖類型
- 鎖實現
-
CAS
- Unsafe
- 原語
線程池
- 使用場景
- 原理與實現方式
- 線程池實現
4.2 線程池詳解
線程池參數介紹
核心線程數,默認情況下,核心線程會一直存活
最大線程數,決定線程池最多可以創建多少線程
線程的空閑時間,空閑時間的單位,當線程閑置超過空閑時間時就會被銷毀
線程緩存隊列
- 有界隊列
- 無界隊列
- 同步隊列
線程池工廠方法
線程池滿時拒絕策略
- 拋出異常
- 丟棄
- 提交失敗時,由提交任務的線程直接執行任務
- 丟棄最早提交的任務
4.3 JUC重點工具實現類
4.4 考察點和加分項
考察點
- 理解線程的同步與互斥的原理(臨界資源、理解區、自旋鎖、偏向鎖 、沖入鎖、讀寫鎖概念)
- 掌握線程安全相關機制(CAS、Synchronized、ThreadLocal使用弱引用ThreadLocalMap)
- 了解JUC工具的使用場景與實現原理
- 熟悉線程池的原理、使用場景、常用配置
- 理解線程的同步與異步、阻塞與非阻塞(同步與異步的區別是任務是否在同一個線程中執行的 ,阻塞與非阻塞的區別是異步執行任務時線程是不是會阻塞等待結構還是會繼續等待后面的邏輯)
加分項
- 結合實際項目經驗或實際案例介紹原理
- 解決多線程問題的排查思路與經驗
- 熟悉常用的線程分析工具與方法
- 了解Java8堆JUC的增強
- 了解Reactive異步編程思想
4.5 真題
- 如何實現一個生產者與消費者模型?(鎖、信號量、線程通信、阻塞隊列等)
- 如何理解線程的同步與異步、阻塞與非阻塞?
- 線程池處理任務的流程是怎樣的?
-
wait與sleep的由什么不同?
- wait屬於Object類,sleep屬於Thread類;
- wait會釋放對象鎖,而sleep不會;
- wait需要在同步塊中使用,sleep可以在任何地方使用;
- sleep需要捕獲異常、wait不需要。
- Synchronized和ReentranLock有什么不同?
- 讀寫鎖適用於什么場景?ReentrantReadWriteLock是如何實現的?
- 讀寫鎖適合讀並發多,寫並發少的場景
- 線程之間如何通信?
- wait和notify機制、共享變量Synchronized
- 保證線程安全的方法由哪些?
- CAS、Synchronized、Lock、ThreadLocal
- 如何盡可能提高多線程並發性能?
- 盡量減少臨界區范圍、使用ThreadLocal、減少線程切換、使用讀寫鎖或CopyOnWrite機制
- ThreadLocal用來解決什么問題?ThreadLocal是如何實現的?
- 重點回答ThreadLocak不是用來解決多線程共享變量的問題,而是線程數據隔離的問題
- 死鎖產生的條件?如何分析是否由線程死鎖?
- 在實際工作中遇到過什么樣的並發問題,如何發現(排查)並解決的?
課時5:數據結構與算法
5.1 知識點匯總
5.1.1 數據結構
隊列
棧
表
- 數組
- 單鏈表
- 雙鏈表
- 循環鏈表
- 散列表
圖
- 有向圖
- 無向圖
- 帶權圖
多叉樹
- B、B+樹
- 字典樹
二叉樹
- 平衡二叉樹
- 紅黑樹
- 哈夫曼樹
- 堆
5.1.2 算法
常用算法思路
- 分治
- 動態規划
- 貪心
- 回溯
- 分支界定
復雜度
- 時間復雜度
- 空間復雜度
排序
-
插入
- 希爾
- 直插
-
交換
- 冒泡
- 快排
-
選擇
- 簡單選擇
- 堆
- 歸並
- 基數
查找
- 二分查找
- 二叉排序樹
- B樹
- BloomFilter
字符串匹配
- BF算法
- BM算法
- Sundady算法
- KMP算法
- Tire樹
5.2 字符串匹配
字符串匹配問題
判斷給定字符串中的括號是否匹配
解體思路:
- 使用棧
- 遇左括號入棧
- 遇右括號出棧,判斷出棧括號是否與右括號成對
5.3 考察點和加分項
考察點
- 了解基本數據結構與特點
- 表、棧、隊列、樹需要熟練掌握,深刻理解使用場景(例如紅黑樹適合搜索,B+樹適合索引)
- 了解常用的搜索、排序算法,及復雜度和穩定性
- 了解常用的字符串處理算法
- 能夠分析算法實現的復雜度
- 了解常用算法分類,解決問題的思路和解決哪類問題
加分項
- 能夠將數據結構與實際使用場景結合(介紹紅黑樹時結合TreeMap的實現,介紹B+樹時結合MySQL的索引)
- 不同算法在業務場景中的應用
- 面對模糊的題目能溝通確認條件和邊界
- 書寫算法代碼前,先講一下解題思路
- 能夠發現解答中的一些問題,給出改進的思路
5.4 真題
題1、題2基礎題,必須掌握
- 各種排序算法實現和復雜度、穩定性
- 二叉樹的前、中、后序遍歷
- 翻轉句子中單詞的順序
- 用棧模擬隊列(或用隊列模擬棧)
- 堆10億個數進行排序,限制內存位1G
- 去掉(或找出)兩個數組中重復的數字
- 將一顆二叉樹轉換成其鏡像
- 確定一個字符串中的括號是否匹配
- 給定一個開始詞,一個結束詞,一個字典,如何找到從開始詞到結束詞的最短單詞接龍路徑
- 如何查找兩個二叉樹節點的最近公共祖先
課時6:常用工具集
6.1 知識點匯總
團隊協作
- Ant
- Maven
- Gradle
- Git
- SVN
質量保證
- Checkstyle
- FindBugs
- SonarQube
壓測
- JMeter
- JMH
- AB
- LoadRunner
容器與代理(隨着微服務的盛行,Envoy、OpenResty、Kong等API網關的使用也越來越普遍)
- Tomcat
- Jetty
- Nginx
- Envoy
- OpenResty
- Kong
CI/CD
- Gitlab-CI
- Jenkins
- Travis
JVM相關
- JMC(JFR)
- jstack、jmap、jstat
系統分析
- vmstat
- iostat & iotop
- ifstat & iftop
- netstat
- dstat
- strace
- GDB
- lsof
- tcpdump
- traceroute
文檔管理
- JavaDoc
- Swagger
網絡工具
- PostMan
- WireShark(網絡包分析工具)
- Fiddler(只針對HTTP進行抓捕)
- Charies
6.2 考察點和加分項
考察點
- 了解常用JVM分析工具
- 掌握Git的常用操作和工作流
- 了解Linux系統下常用的分析工具
加分項
- 能夠主動出擊體現知識廣度(在描述項目問題主動引出工具)
- 能夠體現實戰能力
6.6 真題
- 排查JVM問題有哪些常用工具?
- Git合並代碼有那兩種方法?有什么區別
- Git與SVN有哪些差異?
- 你所在的團隊項目開發使用什么樣工作流?有什么優點?
課時7:必會框架(上)——Spring全家桶
7.1 知識點匯總
Spring
- Spring Framework
- Spring Boot
- Spring Data
-
Spring Cloud
- Sleuth
- Netflix
- Config
- Bus
- Security
- Struts
ORM
- Hibernate
- Mybatis
- Netty
RPC
- Motan
- Bubbo
- Grpc
其他框架
- Jersey
- RESTEasy
- Shiro
7.2 Spring框架
機制與實現
AOP
- 動態代理
- 靜態代理
PlaceHolder動態替換
- PropertyPlaceholderConfigure
- PropertySourcesPlaceholderConfigure
事務
-
隔離級別
- ISOLATION_DEFAULT
- ISOLATION_READ_UNCOMMITTED
- ISOLATION_READ_COMMITTED
- ISOLATION_REPEATABLE_READ
- ISOLATION_SERIALIZABLE
-
傳播行為
- PROPAGATION_REQUIRED
- PROPAGATION_SUPPORTS
- PROPAGATION_MANDATORY
- PROPAGATION_REQUIRED_NEW
- PROPAGATION_NOT_SUPPORTED
- PROPAGATION_NEVER
- PROPAGATION_NESTED
-
核心接口/類
- ApplicationContext
- BeanFactory
- BeanWrapper
- FactoryBean
-
scope
- Singleton
- Prototype
- Request
- Session
- Global-session
- Application
- Websocket
-
事件機制
- ContextRefreshedEvent
- ContextStatedEvent
- ContextStoppedEvent
- ContextClosedEvent
- RequestHandledEvent
Spring應用
類型類
- @Controller
- @service
- @Repository
- @Component
- @Configuration
- @Bean
設置類
- @Required
- @Autowired && @Qualifier
- @Scope
Web類
- @RequestMapping && @GetMapping @ PostMapping
- @PathVariable && @RequestParam
- @RequestBody && @ResponseBody
功能類
- @ImportResource
- @ComponentScan
- @EnableCaching && Cacheable
- @Transactional
- @Aspect && Poincut
- @Scheduled
配置方式
- XML
- 注解
- API
自動裝配
- byType
- byName
- constructor
- autodetect
課時8:必會框架(下)——RPC與ORM
8.1 考察點與加分項
考察點
- 掌握Spring的IOC、AOP的概念與實現
- 掌握Spring的Context創建流程和Bean的生命周期
- 了解Spring常用注解的作用與使用方式
- 了解SpringBoot的相關知識點
- 掌握Netty的線程處理模型
- 知道常用RPC框架的特點
- 了解Mybatis、Hibernate的實現原理
加分項
- 閱讀過框架源碼,了解實現細節及思路
- 除了會應用,還能夠理解理念
- 了解最新實現或方向
- 有實際優化經驗,例如Nett有性能調優
8.2 真題
- SSH和SSM框架組合的區別是生命?
- 能描述一些Spring Context初始化的整個流程嗎?
- 簡單介紹一些Bean的生命周期及作用域
- Spring配置中的placeholder占位符是如何替換的?有什么辦法可以實現自定義的配置替換?
- 要答出通過beanFactoryPostProfessal后置處理器進行的替換,如果要自定義處理,可以擴展PropertyPlaceHolderConfigure或者PropertySourcePlaceHolderConfigure來實現
- SpringMVC的工作流程是怎樣的?
- Spring如何解決循環依賴?
- 從構造器循環依賴和setter循環依賴兩方面來回答
Bean的構造方法、@PostConstruct注解、InitializingBean、init-method的執行順序是怎樣的?
- 說說Netty中有哪些重要的對象,它們之間的關系是什么?
- RPC與HTTP的區別是什么,什么場景適合選用RPC,什么場景適合使用HTTP?
- 在使用方式方面,HTTP使用Client,RPC通過動態代理;從請求模型看,HTTP一般會經過DNS解析,4/7層代理等中間環節,而RPC是點對點直連;從服務治理能力來看,RPC提供豐富的服務治理功能,例如熔斷 、負載均衡,HTTP對跨語言處理比較方便
- RPC的交互流程是怎樣的?
- 請介紹一下Mybatis的緩存機制
- Mybatis如何配置動態SQL?有哪些動態SQL標簽?
課時9:緩存
9.1 考察點和加分項
考察點
- 了解緩存的使用場景,不同類型緩存的使用方式
- 掌握MC和Redis的常用命令
- 了解MC的Redis在內存中的存儲結構
-
- 了解MC和Redis的數據失效方式和剔除策略
- 了解Redis的持久化、主從同步與cluster部署的原理
加分項
- 結合使用場景來介紹緩存的使用
- 有過分布式緩存設計和應用經驗
- 了解緩存使用中可能產生的問題
- 知道Redis的典型應用場景
- 知道Redis的新特性
9.2 真題
- Redis和Memcache有什么區別?該如何選用
- 你用到過哪些Redis的數據結構?用在什么場景下?
- Redis有哪些持久化方式,分別是什么?
- Redis的過期機制是怎樣的?Redis有哪些淘汰策略
- 如何保證Redis的高並發和高可用?
- 如何使用Redis實現延時隊列?如何使用Redis實現分布式鎖?