内容简介
《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,写出更健壮、更高效的应用程序。