源码剖析
GarfieldEr007
这个作者很懒,什么都没留下…
展开
-
Tomcat8源码编译及导入Eclipse中研究
最近因为需求需要修改Tomcat中的某些功能,无奈只能研究那部分源码然后稍作修改。目前Tomcat最新版是8.0,下载了源码包,编译并导入Eclipse中研究比较方便。1.Tomcat8源码编译步骤1.1 先到Apache Tomcat 8.0官网下载最新版Source Code Distributions,解压到某个目录下,如D:\apache-tomcat-8.0.5-src1...转载 2019-11-22 22:07:09 · 863 阅读 · 0 评论 -
MyBatis 源码分析 - 映射文件解析过程
1.简介在上一篇文章中,我详细分析了 MyBatis 配置文件的解析过程。由于上一篇文章的篇幅比较大,加之映射文件解析过程也比较复杂的原因。所以我将映射文件解析过程的分析内容从上一篇文章中抽取出来,独立成文,于是就有了本篇文章。在本篇文章中,我将分析映射文件中出现的一些及节点,比如 <cache>,<cache-ref>,<resultMap>, <s...转载 2018-12-24 20:15:43 · 965 阅读 · 0 评论 -
MyBatis 源码分析 - 配置文件解析过程
本文速览由于本篇文章篇幅比较大,所以这里拿出一节对本文进行快速概括。本篇文章对 MyBatis 配置文件中常用配置的解析过程进行了较为详细的介绍和分析,包括但不限于settings,typeAliases和typeHandlers等,本文的篇幅也主要在对这三个配置解析过程的分析上。下面,我们来一起看一下本篇文章的目录结构。从目录上可以看出,2.3节、2.5节和2.8节的内容比较多。其中...转载 2018-12-24 20:13:12 · 653 阅读 · 0 评论 -
MyBatis 源码分析系列文章导读
1.本文速览本篇文章是我为接下来的 MyBatis 源码分析系列文章写的一个导读文章。本篇文章从 MyBatis 是什么(what),为什么要使用(why),以及如何使用(how)等三个角度进行了说明和演示。由于文章的篇幅比较大,这里特地拿出一章用于介绍本文的结构和内容。那下面我们来看一下本文的章节安排:如上图,本文的大部分篇幅主要集中在了第3章和第4章。第3章演示了几种持久层技术的用...转载 2018-12-24 20:11:51 · 646 阅读 · 0 评论 -
Spring MVC 原理探秘 - 容器的创建过程
1.简介在上一篇文章中,我向大家介绍了 Spring MVC 是如何处理 HTTP 请求的。Spring MVC 可对外提供服务时,说明其已经处于了就绪状态。再次之前,Spring MVC 需要进行一系列的初始化操作。正所谓兵马未动,粮草先行。这些操作包括创建容器,加载 DispatcherServlet 中用到的各种组件等。本篇文章就来和大家讨论一下这些初始化操作中的容器创建操作,容器的创...转载 2018-12-24 20:10:33 · 776 阅读 · 0 评论 -
Spring MVC 原理探秘 - 一个请求的旅行过程
1.简介在前面的文章中,我较为详细的分析了 Spring IOC 和 AOP 部分的源码,并写成了文章。为了让我的 Spring 源码分析系列文章更为丰富一些,所以从本篇文章开始,我将来向大家介绍一下 Spring MVC 的一些原理。在本篇文章中,你将会了解到 Spring MVC 处理请求的过程。同时,你也会了解到 Servlet 相关的知识。以及 Spring MVC 的核心 Dispa...转载 2018-12-24 20:09:57 · 703 阅读 · 0 评论 -
Spring AOP 源码分析 - 拦截器链的执行过程
1.简介本篇文章是 AOP 源码分析系列文章的最后一篇文章,在前面的两篇文章中,我分别介绍了 Spring AOP 是如何为目标 bean 筛选合适的通知器,以及如何创建代理对象的过程。现在我们的得到了 bean 的代理对象,且通知也以合适的方式插在了目标方法的前后。接下来要做的事情,就是执行通知逻辑了。通知可能在目标方法前执行,也可能在目标方法后执行。具体的执行时机,取决于用户的配置。当目标...转载 2018-12-24 20:07:31 · 827 阅读 · 0 评论 -
Spring AOP 源码分析 - 创建代理对象
1.简介在上一篇文章中,我分析了 Spring 是如何为目标 bean 筛选合适的通知器的。现在通知器选好了,接下来就要通过代理的方式将通知器(Advisor)所持有的通知(Advice)织入到 bean 的某些方法前后。与筛选合适的通知器相比,创建代理对象的过程则要简单不少,本文所分析的源码不过100行,相对比较简单。在接下里的章节中,我将会首先向大家介绍一些背景知识,然后再去分析源码。那下...转载 2018-12-24 20:05:46 · 579 阅读 · 0 评论 -
Spring AOP 源码分析 - 筛选合适的通知器
1.简介从本篇文章开始,我将会对 Spring AOP 部分的源码进行分析。本文是 Spring AOP 源码分析系列文章的第二篇,本文主要分析 Spring AOP 是如何为目标 bean 筛选出合适的通知器(Advisor)。在上一篇AOP 源码分析导读一文中,我简单介绍了 AOP 中的一些术语及其对应的源码,部分术语和源码将会在本篇文章中出现。如果大家不熟悉这些术语和源码,不妨去看看。...转载 2018-12-24 19:56:02 · 630 阅读 · 0 评论 -
Spring IOC 容器源码分析 - 余下的初始化工作
1. 简介本篇文章是“Spring IOC 容器源码分析”系列文章的最后一篇文章,本篇文章所分析的对象是 initializeBean 方法,该方法用于对已完成属性填充的 bean 做最后的初始化工作。相较于之前几篇文章所分析的源码,initializeBean 的源码相对比较简单,大家可以愉快的阅读。好了,其他的不多说了,我们直入主题吧。 2. 源码分析本章我们来分析一下 initi...转载 2018-12-23 10:51:40 · 1027 阅读 · 0 评论 -
Spring IOC 容器源码分析 - 填充属性到 bean 原始对象
1. 简介本篇文章,我们来一起了解一下 Spring 是如何将配置文件中的属性值填充到 bean 对象中的。我在前面几篇文章中介绍过 Spring 创建 bean 的流程,即 Spring 先通过反射创建一个原始的 bean 对象,然后再向这个原始的 bean 对象中填充属性。对于填充属性这个过程,简单点来说,JavaBean 的每个属性通常都有 getter/setter 方法,我们可以直接...转载 2018-12-23 10:51:33 · 665 阅读 · 0 评论 -
Spring IOC 容器源码分析 - 循环依赖的解决办法
1. 简介本文,我们来看一下 Spring 是如何解决循环依赖问题的。在本篇文章中,我会首先向大家介绍一下什么是循环依赖。然后,进入源码分析阶段。为了更好的说明 Spring 解决循环依赖的办法,我将会从获取 bean 的方法getBean(String)开始,把整个调用过程梳理一遍。梳理完后,再来详细分析源码。通过这几步的讲解,希望让大家能够弄懂什么是循环依赖,以及如何解循环依赖。循环依...转载 2018-12-23 10:51:27 · 644 阅读 · 0 评论 -
Spring IOC 容器源码分析 - 创建原始 bean 对象
1. 简介本篇文章是上一篇文章(创建单例 bean 的过程)的延续。在上一篇文章中,我们从战略层面上领略了doCreateBean方法的全过程。本篇文章,我们就从战术的层面上,详细分析doCreateBean方法中的一个重要的调用,即createBeanInstance方法。在本篇文章中,你将看到三种不同的构造 bean 对象的方式。你也会了解到构造 bean 对象的两种策略。如果你对这些内容...转载 2018-12-23 10:51:21 · 660 阅读 · 0 评论 -
MyBatis 源码分析 - SQL 的执行过程
本文速览本篇文章较为详细的介绍了 MyBatis 执行 SQL 的过程。该过程本身比较复杂,牵涉到的技术点比较多。包括但不限于 Mapper 接口代理类的生成、接口方法的解析、SQL 语句的解析、运行时参数的绑定、查询结果自动映射、延迟加载等。本文对所列举的技术点,以及部分未列举的技术点都做了较为详细的分析。全文篇幅很大,需要大家耐心阅读。下面来看一下本文的目录:源码分析类文章通常比较...转载 2018-12-24 20:16:32 · 941 阅读 · 0 评论 -
MyBatis 源码分析 - 内置数据源
1.简介本篇文章将向大家介绍 MyBatis 内置数据源的实现逻辑。搞懂这些数据源的实现,可使大家对数据源有更深入的认识。同时在配置这些数据源时,也会更清楚每种属性的意义和用途。因此,如果大家想知其然,也知其所以然。那么接下来就让我们一起去探索 MyBatis 内置数据源的源码吧。MyBatis 支持三种数据源配置,分别为 UNPOOLED、POOLED 和 JNDI。并提供了两种数据源实...转载 2018-12-25 09:22:59 · 641 阅读 · 0 评论 -
HashMap实现原理及源码分析
哈希表(hash table)也叫散列表,是一种非常重要的数据结构,应用场景及其丰富,许多缓存技术(比如memcached)的核心其实就是在内存中维护一张大的哈希表,而HashMap的实现原理也常常出现在各类的面试题中,重要性可见一斑。本文会对java集合框架中的对应实现HashMap的实现原理进行讲解,然后会对JDK7的HashMap源码进行分析。目录 一、什么是哈希表 二、Ha...转载 2019-01-01 00:26:49 · 625 阅读 · 1 评论 -
Dubbo 源码分析 - 集群容错之 LoadBalance
1.简介LoadBalance 中文意思为负载均衡,它的职责是将网络请求,或者其他形式的负载“均摊”到不同的机器上。避免集群中部分服务器压力过大,而另一些服务器比较空闲的情况。通过负载均衡,可以让每台服务器获取到适合自己处理能力的负载。在为高负载的服务器分流的同时,还可以避免资源浪费,一举两得。负载均衡可分为软件负载均衡和硬件负载均衡。在我们日常开发中,一般很难接触到硬件负载均衡。但软件负载均...转载 2018-12-26 19:13:28 · 644 阅读 · 0 评论 -
Dubbo 源码分析 - 集群容错之 Cluster
1.简介为了避免单点故障,现在的应用至少会部署在两台服务器上。对于一些负载比较高的服务,会部署更多台服务器。这样,同一环境下的服务提供者数量会大于1。对于服务消费者来说,同一环境下出现了多个服务提供者。这时会出现一个问题,服务消费者需要决定选择哪个服务提供者进行调用。另外服务调用失败时的处理措施也是需要考虑的,是重试呢,还是抛出异常,亦或是只打印异常等。为了处理这些问题,Dubbo 定义了集群...转载 2018-12-26 19:13:21 · 598 阅读 · 0 评论 -
Dubbo 源码分析 - 集群容错之 Router
1. 简介上一篇文章分析了集群容错的第一部分 – 服务目录 Directory。服务目录在刷新 Invoker 列表的过程中,会通过 Router 进行服务路由。上一篇文章关于服务路由相关逻辑没有细致分析,一笔带过了,本篇文章将对此进行详细的分析。首先,先来介绍一下服务目录是什么。服务路由包含一条路由规则,路由规则决定了服务消费者的调用目标,即规定了服务消费者可调用哪些服务提供者。Dubbo ...转载 2018-12-25 09:28:54 · 642 阅读 · 0 评论 -
Dubbo 源码分析 - 集群容错之Directory
1. 简介前面文章分析了服务的导出与引用过程,从本篇文章开始,我将开始分析 Dubbo 集群容错方面的源码。这部分源码包含四个部分,分别是服务目录 Directory、服务路由 Router、集群 Cluster 和负载均衡 LoadBalance。这几个部分的源码逻辑比较独立,我会分四篇文章进行分析。本篇文章作为集群容错的开篇文章,将和大家一起分析服务目录相关的源码。在进行深入分析之前,我们...转载 2018-12-25 09:28:22 · 596 阅读 · 0 评论 -
Dubbo 源码分析 - 服务引用
1. 简介在上一篇文章中,我详细的分析了服务导出的原理。本篇文章我们趁热打铁,继续分析服务引用的原理。在 Dubbo 中,我们可以通过两种方式引用远程服务。第一种是使用服务直联的方式引用服务,第二种方式是基于注册中心进行引用。服务直联的方式仅适合在调试或测试服务的场景下使用,不适合在线上环境使用。因此,本文我将重点分析通过注册中心引用服务的过程。从注册中心中获取服务配置只是服务引用过程中的一环...转载 2018-12-25 09:27:48 · 604 阅读 · 0 评论 -
Dubbo 源码分析 - 服务导出
1.服务导出过程本篇文章,我们来研究一下 Dubbo 导出服务的过程。Dubbo 服务导出过程始于 Spring 容器发布刷新事件,Dubbo 在接收到事件后,会立即执行服务导出逻辑。整个逻辑大致可分为三个部分,第一是前置工作,主要用于检查参数,组装 URL。第二是导出服务,包含导出服务到本地 (JVM),和导出服务到远程两个过程。第三是向注册中心注册服务,用于服务发现。本篇文章将会对这三个部...转载 2018-12-25 09:27:11 · 763 阅读 · 0 评论 -
Dubbo 源码分析 - 自适应拓展原理
1.原理我在上一篇文章中分析了 Dubbo 的 SPI 机制,Dubbo SPI 是 Dubbo 框架的核心。Dubbo 中的很多拓展都是通过 SPI 机制进行加载的,比如 Protocol、Cluster、LoadBalance 等。有时,有些拓展并非想在框架启动阶段被加载,而是希望在拓展方法被调用时,根据运行时参数进行加载。这听起来有些矛盾。拓展未被加载,那么拓展方法就无法被调用(静态方法...转载 2018-12-25 09:26:39 · 656 阅读 · 0 评论 -
Dubbo 源码分析 - SPI 机制
1.简介SPI 全称为 Service Provider Interface,是一种服务发现机制。SPI 的本质是将接口实现类的全限定名配置在文件中,并由服务加载器读取配置文件,加载实现类。这样可以在运行时,动态为接口加载实现类。正因此特性,我们可以很容易的通过 SPI 机制为我们的程序提供拓展功能。SPI 机制在第三方框架中也有所应用,比如 Dubbo 就是通过 SPI 机制加载所有的组件。...转载 2018-12-25 09:26:06 · 591 阅读 · 0 评论 -
MyBatis 源码分析系列文章合集
1.简介我从七月份开始阅读MyBatis源码,并在随后的40天内陆续更新了7篇文章。起初,我只是打算通过博客的形式进行分享。但在写作的过程中,发现要分析的代码太多,以至于文章篇幅特别大。在这7篇文章中,有4篇文章字数超过了1万,最长的一篇文章约有2.7万字(含代码)。考虑到超长文章对读者不太友好,以及拆分文章工作量也不小等问题。遂决定将博文整理成电子书,方便大家阅读。经过两周紧张的排版,《...转载 2018-12-25 09:25:25 · 657 阅读 · 0 评论 -
MyBatis 源码分析 - 插件机制
1.简介一般情况下,开源框架都会提供插件或其他形式的拓展点,供开发者自行拓展。这样的好处是显而易见的,一是增加了框架的灵活性。二是开发者可以结合实际需求,对框架进行拓展,使其能够更好的工作。以 MyBatis 为例,我们可基于 MyBatis 插件机制实现分页、分表,监控等功能。由于插件和业务无关,业务也无法感知插件的存在。因此可以无感植入插件,在无形中增强功能。开发 MyBatis 插件...转载 2018-12-25 09:24:47 · 552 阅读 · 0 评论 -
MyBatis 源码分析 - 缓存原理
1.简介在 Web 应用中,缓存是必不可少的组件。通常我们都会用 Redis 或 memcached 等缓存中间件,拦截大量奔向数据库的请求,减轻数据库压力。作为一个重要的组件,MyBatis 自然也在内部提供了相应的支持。通过在框架层面增加缓存功能,可减轻数据库的压力,同时又可以提升查询速度,可谓一举两得。MyBatis 缓存结构由一级缓存和二级缓存构成,这两级缓存均是使用 Cache 接口...转载 2018-12-25 09:23:06 · 588 阅读 · 0 评论 -
Spring IOC 容器源码分析 - 创建单例 bean 的过程
1. 简介在上一篇文章中,我比较详细的分析了获取 bean 的方法,也就是getBean(String)的实现逻辑。对于已实例化好的单例 bean,getBean(String) 方法并不会再一次去创建,而是从缓存中获取。如果某个 bean 还未实例化,这个时候就无法命中缓存。此时,就要根据 bean 的配置信息去创建这个 bean 了。相较于getBean(String)方法的实现逻辑,创建...转载 2018-12-23 10:51:16 · 597 阅读 · 0 评论 -
Spring IOC 容器源码分析 - 获取单例 bean
1. 简介为了写 Spring IOC 容器源码分析系列的文章,我特地写了一篇 Spring IOC 容器的导读文章。在导读一文中,我介绍了 Spring 的一些特性以及阅读 Spring 源码的一些建议。在做完必要的准备工作后,从本文开始,正式开始进入源码分析的阶段。在本篇文章中,我将会详细分析BeanFactory的getBean(String)方法实现细节,getBean(Strin...转载 2018-12-23 10:51:09 · 1124 阅读 · 0 评论 -
Spring IOC 容器源码分析系列文章导读
1. 简介前一段时间,我学习了 Spring IOC 容器方面的源码,并写了数篇文章对此进行讲解。在写完 Spring IOC 容器源码分析系列文章中的最后一篇后,没敢懈怠,趁热打铁,花了3天时间阅读了 AOP 方面的源码。开始以为 AOP 部分的源码也会比较复杂,所以原计划投入一周的时间用于阅读源码。但在我大致理清 AOP 源码逻辑后,发现没想的那么复杂,所以目前进度算是超前了。从今天(5....转载 2018-12-24 19:55:57 · 567 阅读 · 0 评论 -
Java集合---LinkedList源码解析
一、源码解析 1、 LinkedList类定义。 public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, java.io.Serializable Link...转载 2018-12-05 12:53:30 · 559 阅读 · 1 评论 -
Java源码分析之HashMap(JDK1.8)
一、HashMap概述 HashMap是常用的Java集合之一,是基于哈希表的Map接口的实现。与HashTable主要区别为不支持同步和允许null作为key和value。由于HashMap不是线程安全的,如果想要线程安全,可以使用ConcurrentHashMap代替。二、HashMap数据结构 HashMap的底层是哈希数组,数组元素为Entry。HashMap通过key的has...转载 2018-12-05 12:52:12 · 542 阅读 · 0 评论 -
面试必备:LinkedHashMap源码解析(JDK8)
1 概述在上文中,我们已经聊过了HashMap,本篇是基于上文的基础之上。所以如果没看过上文,请先阅读面试必备:HashMap源码解析(JDK8) 本文将从几个常用方法下手,来阅读LinkedHashMap的源码。 按照从构造方法->常用API(增、删、改、查)的顺序来阅读源码,并会讲解阅读方法中涉及的一些变量的意义。了解LinkedHashMap的特点、适用场景。如果本文中有不正...转载 2018-12-05 12:49:23 · 695 阅读 · 0 评论 -
CouncurrentHashMap源码解析
注:本文源码是JDK8的版本,与之前的版本有较大差异jdk1.7的源码:https://www.cnblogs.com/chengxiao/p/6842045.htmlConcurrentHashMap是conccurrent家族中的一个类,由于它可以高效地支持并发操作,以及被广泛使用,经典的开源框架Spring的底层数据结构就是使用ConcurrentHashMap实现的。与同是线程安全...转载 2018-12-05 12:47:05 · 968 阅读 · 0 评论 -
ConcurrentHashMap实现原理及源码分析
ConcurrentHashMap是Java并发包中提供的一个线程安全且高效的HashMap实现(若对HashMap的实现原理还不甚了解,可参考我的另一篇文章HashMap实现原理及源码分析),ConcurrentHashMap在并发编程的场景中使用频率非常之高,本文就来分析下ConcurrentHashMap的实现原理,并对其实现原理进行分析(JDK1.7).ConcurrentHashMa...转载 2018-12-05 12:45:47 · 593 阅读 · 0 评论 -
ThreadPoolExecutor源码解析(二)
1.ThreadPoolExcuter运行实例 首先我们先看如何新建一个ThreadPoolExecutor去运行线程。然后深入到源码中去看ThreadPoolExecutor里面使如何运作的。public class Test { public static void main(String[] args){ /** * 新建一个线程池...转载 2018-12-03 12:19:55 · 511 阅读 · 0 评论 -
java集合(6):TreeMap源码分析(jdk1.8)
前言TreeMap的基本概念:TreeMap集合是基于红黑树(Red-Black tree)的 NavigableMap实现。该集合最重要的特点就是可排序,该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法。这句话是什么意思呢?就是说TreeMap可以对添加进来的元素进行排序,可以按照默认的排序方式,也可以自己指定排序方式。...转载 2018-12-05 12:43:12 · 541 阅读 · 0 评论 -
HashSet源码解析
前面我们花了一定的篇幅学习了HashMap的一些底层原理,以及简单了解了HashSet和HashMap两种集合的渊源,现在我们从HashSet源码入手,来学习HashSet更细节的地方。对于HashSet而言,它是基于HashMap实现的。HashSet底层采用HashMap来保存元素,因此HashSet底层其实比较简单。package java.util;public class H...转载 2018-12-05 12:42:05 · 862 阅读 · 0 评论 -
源码分析-HashSet、LinkedHashSet
基本特性HashSet的是依靠组合一个HashMap实现的。然后讲大部分任务都委托给HashMap完成。 当然,HashSet不保证迭代顺序与添加顺序相同,而且也不保证其顺序不变。允许空元素。 对于其迭代器的迭代效率正比于(HashSet的内元素和HashSet的桶数量之和),因此如果对迭代效率要求比较高,就不要使用过大的初始大小。(这部分从HashSet本身的代码看不出来,今后分析Hash...转载 2018-12-05 12:41:12 · 542 阅读 · 0 评论 -
TreeSet源码解析
TreeSet概述所有实现的接口:Serializable, Cloneable, Iterable<E>, Collection<E>, NavigableSet<E>, Set<E>, SortedSet<E>1以下是类的对应关系。从左到右分析上图: 实现Serializable接口,即支持序列化。 实现Clonea...转载 2018-12-03 12:20:35 · 562 阅读 · 0 评论