摘要: 一、测试结论 static final 修饰的基本类型和String类型不能通过反射修改; 二、测试案例 @Test public void test01() throws Exception { setFinalStatic(Constant.class.getDeclaredField("i1" 阅读全文
posted @ 2020-07-08 15:39 三枣 阅读(3187) 评论(1) 推荐(1) 编辑
摘要: 本篇博客就是 myabtis 系列的最后一篇了,还剩 ResultSetHandler 没有分析;作为整个 mybatis 最复杂最繁琐的部分,我不打算按步骤一次详解,因为里面的主要内容就是围绕 resultMap 按层次结构依次解析的,其中运用最多的就是反射,所以我这里将围绕延迟加载重点分析,另外 阅读全文
posted @ 2019-09-05 15:43 三枣 阅读(3570) 评论(0) 推荐(2) 编辑
摘要: 一、KeyGenerator 概述 在平时开发的时候经常会有这样的需求,插入数据返回主键,或者插入数据之前需要获取主键,这样的需求在 mybatis 中也是支持的,其中主要的逻辑部分就在 KeyGenerator 中,下面是他的类图: 其中: NoKeyGenerator:默认空实现,不需要对主键单 阅读全文
posted @ 2019-09-02 15:48 三枣 阅读(3830) 评论(0) 推荐(0) 编辑
摘要: 分析到这里的时候,mybatis 初始化、接口、事务、缓存等主要功能都已经讲完了,现在就还剩下 StatementHandler 这个真正干活的家伙没有分析了;所以接下来的博客内容主要和数据库的关系比较密切,而 StatementHandler 的主要流程也基本是和 JDBC 的流程是一一对应的; 阅读全文
posted @ 2019-08-30 15:44 三枣 阅读(828) 评论(0) 推荐(0) 编辑
摘要: 本篇博客将主要讲解 mybatis 插件的主要流程,其中主要包括动态代理和责任链的使用; 一、mybatis 拦截器主体结构 在编写 mybatis 插件的时候,首先要实现 Interceptor 接口,然后在 mybatis conf.xml 中添加插件, 这里需要注意的是,添加的插件是有顺序的, 阅读全文
posted @ 2019-08-28 14:27 三枣 阅读(3486) 评论(0) 推荐(0) 编辑
摘要: 本篇博客主要讲了 mybatis 一二级缓存的构成,以及一些容易出错地方的示例分析; 一、mybatis 缓存体系 mybatis 的一二级缓存体系大致如下: 首先当一二级缓存同时开启的时候,首先命中二级缓存; 一级缓存位于 BaseExecutor 中不能关闭,但是可以指定范围 STATEMENT 阅读全文
posted @ 2019-08-26 19:06 三枣 阅读(919) 评论(0) 推荐(0) 编辑
摘要: 本文将主要介绍 Executor 的整体结构和各子类的功能,并对比效率; 一、Executor 主体结构 1. 类结构 executor 的类结构如图所示: 其各自的功能: BaseExecutor:基础执行器,封装了子类的公共方法,包括一级缓存、延迟加载、回滚、关闭等功能; SimpleExecu 阅读全文
posted @ 2019-08-22 16:11 三枣 阅读(1647) 评论(0) 推荐(0) 编辑
摘要: mybatis 的初始化还是相对比较复杂,但是作者在初始化过程中使用了多种设计模式,包括建造者、动态代理、策略、外观等,使得代码的逻辑仍然非常清晰,这一点非常值得我们学习; 一、mapper 初始化主要流程 mybatis 初始化的过程中,主要是 XML 配置的解析,不同的部分又分别委托给了不同的解 阅读全文
posted @ 2019-08-20 12:27 三枣 阅读(1539) 评论(1) 推荐(1) 编辑
摘要: 本篇博客将主要对 mybatis 整体介绍,包括 mybatis 的项目结构,执行的主要流程,初始化流程,API 等各模块进行简单的串联,让你能够对 mybatis 有一个整体的把握。另外在 mybatis 源码的阅读过程中,如果不想写 demo 可以直接使用项目中的单元测试; 一、mybatis 阅读全文
posted @ 2019-08-15 18:57 三枣 阅读(1973) 评论(0) 推荐(0) 编辑
摘要: Disruptor 的大名从很久以前就听说了,但是一直没有时间;看完以后才发现其内部的思想异常清晰,很容易就能前移到其他的项目,所以仔细了解一下还是很有必要的这。篇博客将主要从源码角度分析,Disruptor 为什么那么快,在此之前可以先查看 "Disruptor 详解 一" ,能够对 Disrup 阅读全文
posted @ 2019-07-14 18:08 三枣 阅读(986) 评论(0) 推荐(1) 编辑
摘要: 这篇博客将主要通过几个示例,简单讲述 Disruptor 的使用方法; 一、disruptor 简介 "Disruptor" 是英国外汇交易公司 LMAX 开发的一个 无锁 高性能的线程间消息传递的框架。目前包括 Apache Storm、Camel、Log4j2 等知名项目都是用了 Disrupt 阅读全文
posted @ 2019-07-10 16:45 三枣 阅读(1929) 评论(0) 推荐(0) 编辑
摘要: 本文将主要讲述 JDK1.8 版本 的 ConcurrentHashMap,其内部结构和很多的哈希优化算法,都是和 JDK1.8 版本的 HashMap是一样的,所以在阅读本文之前,一定要先了解 HashMap,可以参考 "HashMap 相关" ;另外 ConcurrentHashMap 中同样有 阅读全文
posted @ 2019-04-29 20:03 三枣 阅读(3052) 评论(1) 推荐(2) 编辑
摘要: 文本将主要讲述 一个特殊的子类 ,主要用于执行周期性任务;所以在看本文之前最好先了解一下 ,可以参考 "ThreadPoolExecutor 详解" ;另外 中使用了延迟队列,主要是基于完全二叉堆实现的,可以参考 "完全二叉堆" ; 一、ScheduledThreadPoolExecutor 结构概 阅读全文
posted @ 2019-04-24 09:51 三枣 阅读(9662) 评论(0) 推荐(6) 编辑
摘要: 本文将主要讲述在堆排序和优先级队列中使用的一种数据结构,二叉堆; 一、结构概述 完全二叉堆,首先在逻辑上是树形结构,完全二字则表明是完全的二叉树,其结构如图所示: 结构性: 正是因为是完全结构的二叉树,所以可以将节点映射到数组中,其运算关系如下,i 表示数组下标: 父节点: ; 左孩子:`1 + ( 阅读全文
posted @ 2019-04-17 16:39 三枣 阅读(1086) 评论(0) 推荐(0) 编辑
摘要: 本文将主要介绍我们平时最常用的线程池 ,有可能你平时没有直接使用这个类,而是使用 的工厂方法创建线程池,虽然这样很简单,但是很可能因为这个线程池发生 OOM ,具体情况文中会详细介绍; 二、ThreadPoolExecutor 概览 的继承关系如图所示: 其中: Executor :定义了 异步接口 阅读全文
posted @ 2019-04-15 20:12 三枣 阅读(3745) 评论(2) 推荐(1) 编辑