內容簡介
《Spring源碼深度解析》從核心實現和企業應用兩個方麵,由淺入深、由易到難地對Spring源碼展開瞭係統的講解,包括Spring的設計理念和整體架構、容器的基本實現、默認標簽的解析、自定義標簽的解析、bean的加載、容器的功能擴展、AOP、數據庫連接JDBC、整閤MyBatis、事務、SpringMVC、遠程服務、Spring消息服務等內容。
《Spring源碼深度解析》不僅介紹瞭使用Spring框架開發項目必須掌握的核心概念,還指導讀者如何使用Spring框架編寫企業級應用,並針對在編寫代碼的過程中如何優化代碼、如何使得代碼高效給齣切實可行的建議,從而幫助讀者全麵提升實戰能力。
《Spring源碼深度解析》語言簡潔,示例豐富,可幫助讀者迅速掌握使用Spring進行開發所需的各種技能。《Spring源碼深度解析》適閤於已具有一定Java編程基礎的讀者,以及在Java平颱下進行各類軟件開發的開發人員、測試人員等。
內頁插圖
目錄
第一部分 核心實現
第1章 Spring整體架構和環境搭建
1.1 Spring的整體架構
1.2 環境搭建
1.2.1 安裝GitHub
1.2.2 安裝Gradle
1.2.3 下載Spring
第2章 容器的基本實現
2.1 容器基本用法
2.2 功能分析
2.3 工程搭建
2.4 Spring的結構組成
2.4.1 beans包的層級結構
2.4.2 核心類介紹
2.5 容器的基礎XmlBeanFactory
2.5.1 配置文件封裝
2.5.2 加載Bean
2.6 獲取XML的驗證模式
2.6.1 DTD與XSD區彆
2.6.2 驗證模式的讀取
2.7 獲取Document
2.7.1 EntityResolver用法
2.8 解析及注冊BeanDefinitions
2.8.1 profile屬性的使用
2.8.2 解析並注冊BeanDefinition
第3章 默認標簽的解析
3.1 bean標簽的解析及注冊
3.1.1 解析BeanDefinition
3.1.2 AbstractBeanDefinition屬性
3.1.3 解析默認標簽中的自定義標簽元素
3.1.4 注冊解析的BeanDefinition
3.1.5 通知監聽器解析及注冊完成
3.2 alias標簽的解析
3.3 import標簽的解析
3.4 嵌入式beans標簽的解析
第4章 自定義標簽的解析
4.1 自定義標簽使用
4.2 自定義標簽解析
4.2.1 獲取標簽的命名空間
4.2.2 提取自定義標簽處理器
4.2.3 標簽解析
第5章 bean的加載
5.1 FactoryBean的使用
5.2 緩存中獲取單例bean
5.3 從bean的實例中獲取對象
5.4 獲取單例
5.5 準備創建bean
5.5.1 處理ovverride屬性
5.5.2 實例化的前置處理
5.6 循環依賴
5.6.1 什麼是循環依賴
5.6.2 Spring如何解決循環依賴
5.7 創建bean
5.7.1 創建bean的實例
5.7.2 記錄創建bean的ObjectFactory
5.7.3 屬性注入
5.7.4 初始化bean
5.7.5 注冊DisposableBean
第6章 容器的功能擴展
6.1 設置配置路徑
6.2 擴展功能
6.3 環境準備
6.4 加載BeanFactory
6.4.1 定製BeanFactory
6.4.2 加載BeanDefinition
6.5 功能擴展
6.5.1 增加SPEL語言的支持
6.5.2 增加屬性注冊編輯器
6.5.3 添加ApplicationContext AwareProcessor處理器
6.5.4 設置忽略依賴
6.5.5 注冊依賴
6.6 BeanFactory的後處理
6.6.1 激活注冊的BeanFactory PostProcessor
6.6.2 注冊BeanPostProcessor
6.6.3 初始化消息資源
6.6.4 初始化ApplicationEvent Multicaster
6.6.5 注冊監聽器
6.7 初始化非延遲加載單例
6.8 finishRefresh
第7章 AOP
7.1 動態AOP使用示例
7.2 動態AOP自定義標簽
7.2.1 注冊AnnotationAwareAspectJ AutoProxyCreator
7.3 創建AOP代理
7.3.1 獲取增強器
7.3.2 尋找匹配的增強器
7.3.3 創建代理
7.4 靜態AOP使用示例
7.5 創建AOP靜態代理
7.5.1 Instrumentation使用
7.5.2 自定義標簽
7.5.3 織入
第二部分 企業應用
第8章 數據庫連接JDBC
8.1 Spring連接數據庫程序實現(JDBC)
8.2 save/update功能的實現
8.2.1 基礎方法execute
8.2.2 Update中的迴調函數
8.3 query功能的實現
8.4 queryForObject
第9章 整閤MyBatis
9.1 MyBatis獨立使用
9.2 Spring整閤MyBatis
9.3 源碼分析
9.3.1 sqlSessionFactory創建
9.3.2 MapperFactoryBean的創建
9.3.3 MapperScannerConfigurer
第10章 事務
10.1 JDBC方式下的事務使用 示例
10.2 事務自定義標簽
10.2.1 注冊InfrastructureAdvisor AutoProxyCreator
10.2.2 獲取對應class/method的增強器
10.3 事務增強器
10.3.1 創建事務
10.3.2 迴滾處理
10.3.3 事務提交
第11章 SpringMVC
11.1 SpringMVC快速體驗
11.2 ContextLoaderListener
11.2.1 ServletContextListener的使用
11.2.2 Spring中的ContextLoader Listener
11.3 DispatcherServlet
11.3.1 servlet的使用
11.3.2 DispatcherServlet的初始化
11.3.3 WebApplicationContext的初始化
11.4 DispatcherServlet的邏輯處理
11.4.1 MultipartContent類型的request處理
11.4.2 根據request信息尋找對應的Handler
11.4.3 沒找到對應的Handler的錯誤處理
11.4.4 根據當前Handler尋找對應的HandlerAdapter
11.4.5 緩存處理
11.4.6 HandlerInterceptor的處理
11.4.7 邏輯處理
11.4.8 異常視圖的處理
11.4.9 根據視圖跳轉頁麵
第12章 遠程服務
12.1 RMI
12.1.1 使用示例
12.1.2 服務端實現
12.1.3 客戶端實現
12.2 HttpInvoker
12.2.1 使用示例
12.2.2 服務端實現
12.2.3 客戶端實現
第13章 Spring消息
13.1 JMS的獨立使用
13.2 Spring整閤ActiveMQ
13.3 源碼分析
13.3.1 JmsTemplate
13.3.2 監聽器容器
……
前言/序言
《Java虛擬機原理剖析》 內容簡介 《Java虛擬機原理剖析》是一本深入探討Java虛擬機(JVM)內部工作機製的專業技術書籍。本書旨在為Java開發者提供一個全麵而深刻的理解,幫助他們掌握JVM的內存管理、垃圾迴收、類加載、執行引擎以及性能優化等核心概念。通過詳實的講解和大量的源碼分析,本書將引領讀者穿越JVM的層層帷幕,洞察Java程序運行的底層邏輯。 第一部分:JVM內存模型與區域劃分 本部分將首先構建讀者對JVM內存結構的宏觀認識。我們將詳細解析JVM運行時數據區的各個組成部分,包括程序計數器、虛擬機棧、本地方法棧、堆和方法區。 程序計數器 (Program Counter Register):揭示程序計數器如何扮演JVM指令執行的“路綫圖”,以及它在多綫程環境下的工作原理。我們將分析不同綫程下程序計數器獨立存在的意義,以及它為何是唯一一個不會發生`OutOfMemoryError`的區域。 虛擬機棧 (Java Virtual Machine Stacks):深入理解虛擬機棧如何管理Java方法的調用和返迴。我們將詳細講解棧幀(Stack Frame)的組成,包括局部變量錶、操作數棧、動態鏈接和方法齣口等,並分析`StackOverflowError`和`OutOfMemoryError`在棧溢齣時的具體錶現和原因。 本地方法棧 (Native Method Stacks):解釋本地方法棧如何為使用`native`關鍵字聲明的方法提供內存空間,並闡述其與虛擬機棧的異同。 堆 (Heap):這是JVM內存管理的核心區域,用於存放對象實例。我們將詳細講解堆的劃分,包括年輕代(Young Generation)中的Eden區、Survivor From區和Survivor To區,以及老年代(Old Generation)。通過對垃圾迴收算法(如Serial、ParNew、Parallel Scavenge)在年輕代中的工作流程分析,揭示對象如何在這些區域之間晉升。 方法區 (Method Area):闡述方法區(也稱永久代或元空間)存儲的類信息、常量、靜態變量和方法代碼等。我們將討論`OutOfMemoryError`在方法區發生的場景,如類加載過多,以及Java 8之後元空間(Metaspace)的引入及其對方法區內存管理的改變。 第二部分:垃圾迴收機製詳解 垃圾迴收(GC)是Java內存管理的關鍵環節,也是性能調優的重中之重。《Java虛擬機原理剖析》將花費大量篇幅深入剖析GC的方方麵麵。 對象存活判斷:詳細介紹判斷對象是否可達的兩種主要算法:引用計數法(及其缺點,如循環引用)和可達性分析算法。我們將重點講解可達性分析算法是如何通過一係列的“GC Roots”對象(如虛擬機棧中的本地變量、靜態變量、常量引用等)來查找存活對象的。 經典垃圾迴收算法: 標記-清除算法 (Mark-Sweep):解析其基本過程,即先標記所有可達對象,然後清除所有未被標記的對象,並討論其産生的內存碎片問題。 標記-整理算法 (Mark-Compact):介紹其在標記-清除算法基礎上的改進,即在標記完可達對象後,將所有存活對象嚮一端移動,然後清除掉端邊界以外的內存,從而避免內存碎片。 復製算法 (Copying):解釋其如何將內存劃分為兩塊,一塊用於分配,另一塊用於 GC,然後將存活對象復製到另一塊區域,從而保證內存的連續性,但其缺點是空間利用率較低。 垃圾迴收器:我們將對主流的垃圾迴收器進行詳細的介紹和對比,包括: Serial (串行):單綫程的GC,簡單高效,但會引起較長的“Stop-the-world”停頓。 ParNew (並行):Serial的並行版本,多綫程進行GC,適用於多CPU環境。 Parallel Scavenge:關注吞吐量,通過多綫程並行進行GC,適閤需要高吞吐量的場景。 CMS (Concurrent Mark Sweep):追求最短停頓時間,采用多綫程並發進行標記和清除,但可能産生內存碎片。 G1 (Garbage-First):區域化分代的垃圾迴收器,將堆劃分為多個大小相等的區域,可以預測GC停頓時間,適用於大堆內存。 ZGC 和 Shenandoah:介紹近年來推齣的低延遲GC,旨在實現幾乎零停頓,特彆適閤對響應時間要求極高的應用。 我們將分析不同GC的工作模式、適用場景以及它們的優缺點,並提供如何根據具體業務場景選擇閤適的GC的指導。 GC 觸發時機與調優:講解JVM何時會觸發GC,如內存不足、顯式調用`System.gc()`(不推薦)、以及垃圾迴收器自身的調度。我們將深入分析GC日誌的解讀方法,並通過實際案例演示如何通過調整GC參數來優化內存使用和提升應用程序性能。 第三部分:類加載機製探秘 類加載是Java程序運行的基石。本書將全麵揭示Java類是如何被加載、連接和初始化的。 類加載的時機:明確Java類在什麼情況下會被加載,包括創建類的實例、訪問類的靜態變量(final常量除外)、調用類的靜態方法、使用反射、以及初始化子類等。 類加載器 (Class Loaders):深入理解類加載器的層級結構: 啓動類加載器 (Bootstrap ClassLoader):負責加載核心Java API(如`rt.jar`中的類)。 擴展類加載器 (Extension ClassLoader):負責加載`jre/lib/ext`目錄下的類。 應用程序類加載器 (Application ClassLoader):負責加載用戶自定義的類。 自定義類加載器 (Custom ClassLoader):講解如何編寫自定義類加載器以實現熱部署、加密或動態加載等高級功能。 雙親委派模型 (Parent Delegation Model):詳細闡述雙親委派模型的工作原理,即當一個類加載器接收到加載類的請求時,它會先將這個請求委派給自己的父類加載器去執行,直到頂層的啓動類加載器。隻有當父類加載器反饋無法加載該類時,纔會由當前類加載器自己去加載。我們將分析其存在的意義,即確保Java核心類庫的一緻性和安全性,防止重復加載和惡意代碼的注入。 類加載過程:分解類加載的三個主要階段: 加載 (Loading):根據類名查找二進製字節碼,並解析成方法區中的運行時數據結構。 連接 (Linking): 驗證 (Verification):確保被加載類的字節碼符閤JVM規範,例如檢查文件格式、元數據、字節碼指令等。 準備 (Preparation):為類的靜態變量分配內存,並設置默認初始值。 解析 (Resolution):將類中符號引用替換為直接引用(如方法區的具體內存地址)。 初始化 (Initialization):為類的靜態變量賦予正確的初始值,執行構造代碼塊和靜態初始化塊。 我們將通過源碼分析,展示類的加載過程是如何一步步完成的。 第四部分:JVM執行引擎與字節碼指令 本部分將揭示Java程序在JVM中是如何被執行的。 JVM的執行模式:講解JVM是如何執行Java字節碼的,主要有兩種模式: 解釋執行 (Interpretation):逐條解析字節碼指令並執行。 即時編譯 (Just-In-Time Compilation, JIT):在程序運行過程中,將頻繁執行的熱點代碼編譯成機器碼,從而提升執行效率。 即時編譯器 (JIT Compiler):深入分析JVM中的JIT編譯器,如C1編譯器(客戶端編譯器)和C2編譯器(服務端編譯器),以及分層編譯(Tiered Compilation)策略。我們將探討編譯器是如何識彆熱點代碼(如基於方法調用計數和迴邊計數),以及如何進行代碼優化,包括逃逸分析、方法內聯、無用代碼消除等。 字節碼指令集:簡單介紹Java字節碼指令的結構和特點,以及JVM如何通過操作棧來執行指令。雖然本書不側重於深入指令集的解析,但會為理解執行過程提供必要的背景知識。 JVM的性能監控與分析工具:介紹常用的JVM性能監控和診斷工具,如JPS(進程查看)、JSTAT(監控統計)、JMAP(內存映射)、JCMD(通用命令)以及VisualVM、JConsole等圖形化工具,並講解如何利用這些工具來定位和解決性能問題。 第五部分:JVM性能調優實戰 理論結閤實踐,《Java虛擬機原理剖析》的最後部分將聚焦於JVM的性能調優。 內存溢齣與內存泄漏的排查:提供一套係統性的方法來排查`OutOfMemoryError`和內存泄漏問題,包括如何使用內存分析工具(如Eclipse Memory Analyzer, MAT)來分析堆轉儲文件(Heap Dump)。 GC調優策略:結閤前麵GC部分的知識,提供具體的GC調優思路和參數配置建議,針對不同的應用場景,指導讀者如何選擇和配置閤適的垃圾迴收器,以及調整相關參數以達到最佳性能。 綫程調優:講解如何分析綫程 Dump,識彆死鎖、活鎖、綫程飢餓等問題,並提供綫程池的優化建議。 JVM參數優化:詳細解讀JVM常用參數的含義和作用,如堆大小設置(`-Xms`, `-Xmx`)、新生代與老年代比例、GC相關參數等,並提供一些常用的優化配置模闆。 案例分析:通過多個真實的性能問題案例,演示如何運用本書所學的知識和工具,一步步定位並解決性能瓶頸,幫助讀者在實際工作中快速掌握JVM性能調優的技巧。 目標讀者 有一定Java編程基礎,希望深入理解Java運行機製的開發者。 需要進行JVM性能調優,提升應用程序運行效率的工程師。 對計算機底層原理感興趣,想瞭解Java如何在虛擬機上高效運行的架構師或技術愛好者。 準備Java相關高級技術麵試的開發者。 《Java虛擬機原理剖析》不僅是一本技術手冊,更是一次通往Java底層世界的探索之旅。通過本書,您將能夠更自信地駕馭Java,寫齣更健壯、更高效的應用程序。