MyBatis 源码解析:SQL 语句的执行机制

通过前面两篇文章,我们完成了对 MyBatis 所有配置文件(包括配置文件和映射文件)解析机制的分析。回忆一下我们最开始给出的 MyBatis 小示例(如下),经过前面千山万水的跋涉,我们终于完成了第一行代码的 … 99% …(手动滑稽),这最后的 1% 就是创建 SqlSessionFactory 对象,所有的配置解析最后都会封装到 Configuration 对象中,接下去就是调用 SqlSessionFactoryBuilder 对象的 build 方法创建 SqlSessionFactory 对象,这里使用的是 DefaultSqlSessionFactory 实现类进行实例化。 123456SqlSessionFactory sessionFactory = new SqlS...

阅读全文

MyBatis 源码解析:映射文件的加载与解析

上一篇中我们分析了配置文件的加载和解析过程,本文我们将一起来探究映射文件的加载与解析实现,MyBatis 提供映射文件以配置 SQL 语句、二级缓存,以及结果集映射等,是区别与其它 ORM 框架的主要特色之一。 在前面分析配置文件解析 <mappers/> 节点时,我们曾触及到 XMLMapperBuilder 的 parse 方法,这也正是解析映射文件的入口,该方法的实现如下: 12345678910111213141516171819public void parse() { // 1. 加载并解析映射文件 if (!configuration.isResourceLoaded(resource)) { // 映射文件未加载...

阅读全文

MyBatis 源码解析:配置文件的加载与解析

前面我们曾约定 mybatis-config.xml 为配置文件,SQL 配置文件为映射文件,本文我们将沿用上一篇中的示例程序,一起来探究一下 MyBatis 加载和解析配置文件,即 mybatis-config.xml 的过程。 在示例程序中,执行配置文件(包括后面要介绍映射文件)加载与解析的过程位于第一行代码中(如下),其中 Resources 是一个简单的基于类路径获取数据流的工具类,借助该工具类可以获取配置文件 mybatis-config.xml 的 InputStream 对象,然后将其传递给 SqlSessionFactoryBuilder 的 build 方法以构造 SqlSessionFactory。 1SqlSessionFactory sessionFactory...

阅读全文

MyBatis 源码解析:架构初探

MyBatis 是一个易用、轻量,且强大的半自动化 ORM 框架。记得多年前第一次接触该框架的时候它的名字还叫作 iBatis,那时候刚接触到 java web 开发,倦于徒手写 JDBC 代码的枯燥,于是开始转战 ORM 框架。SSH 一直被认为是 java web 开发的三大件,所以 Hibernate 当时被视为首选,但是第一次使用的过程并不愉快,不需要自己写 SQL 的结果就是自动生成的 SQL 查询效率非常低效(原因应该在于我对这个框架不够熟悉),于是放弃了对 Hibernate 的坚持,投入了 MyBatis 的怀抱,到今天为止已经使用 MyBatis 框架开发了好几个项目,虽然现在工作中使用我司自研的 ORM 框架,但是鉴于对 MyBatis 的好感,决定利用空余时间对其...

阅读全文

理解分布式一致性算法:paxos

什么?Paxos 号称是最难理解的算法?虽然有些夸张,那也得看一下! 直接入正题,在分布式系统中存在多个主机节点,这些主机之间的通信机制一般分为 共享内存 和 消息传递 两种。这两种方式各有优劣,而 paxos 算法主要用来解决基于消息机制的分布式一致性问题。 在分布式系统中,网络一般被认为是不可靠的,所以传递的消息可能会存在延迟、丢失、重复等问题,发送消息的进程也可能出现运行缓慢、重启,甚至被杀死等情况。Paxos 算法解决的问题是在一个可能发生这些异常(不包括消息可能被篡改的情况)的分布式系统中如何就某个值达成一致,保证不论发生以上任何异常,都不会破坏决策一致性的问题。 一. 算法陈述在 paxos 算法中定义了三种角色,包括 提案者(Proposer)、决策者(Acceptor)...

阅读全文

探秘线程池 ThreadPoolExecutor 的任务调度过程

线程池是 java 并发包的核心组件之一,为了减少线程创建和销毁所带来的性能开销,在实际项目中都会采用线程池来管理线程的创建、复用,以及消亡等过程。Executors 类提供了多种方法来简化线程池的创建,典型的应用场景如下: 12int nCpu = Runtime.getRuntime().availableProcessors();ExecutorService es = Executors.newFixedThreadPool(nCpu + 1); 上述示例中通过调用 newFixedThreadPool(int nThreads) 方法,我们创建了一个大小为 CPU 核心数加 1 的线程池。此外,Executors 还提供了newSingleThreadExecutor() ...

阅读全文

探秘 ThreadLocal 的实现内幕与小地雷

Java 多线程类库对于共享数据的读写访问主要采用锁机制来保证线程安全,而本文所要探究的 ThreadLocal 则采用了一种完全不同的策略,它不是用来解决共享数据的并发访问问题的,ThreadLocal 让每个线程都将目标数据复制一份作为线程私有,后续对于该数据的操作都是在各自私有的副本上进行,线程之间彼此相互隔离,也就不存在竞争问题。 下面的例子演示了 ThreadLocal 的典型应用场景,在 jdk 1.8 之前,如果我们希望对日期和时间进行格式化操作,则需要使用 SimpleDateFormat 类,而我们知道它是是线程不安全的,在多线程并发执行时会出现一些奇怪的问题,而对于该类使用的最佳实践则是采用 ThreadLocal 进行包装,以保证每个线程都有一份属于自己的 Sim...

阅读全文

Spring MVC 源码解析:跟踪一次简单的请求处理过程

上一篇我们分析了 web 环境下容器的初始化过程,探究了在 web 项目启动过程中,Spring MVC 所执行的一系列初始化工作,本篇中我们将一起来跟踪一次 Spring MVC 对于请求的具体处理过程,从整体上对 Spring MVC 的逻辑处理进行感知,先把握整体,后追究细节。 我们定义的控制器方法很简单,接收请求参数,然后记录到 Model 中并回显到页面上,实现如下: 123456789// http://localhost:8080/demo/hello?name=zhenchao@RequestMapping("/hello")public ModelAndView hello(@RequestParam("name") String name) { lo...

阅读全文

Spring MVC 源码解析:Web 环境下容器的初始化过程

Spring MVC 是目前最流行的 java web 框架(之一),是对传统 servlet 的高级封装,以提升 servlet 的灵活性和易用性。从广义上来说,Spring MVC 的执行过程可以分为 容器初始化 和 请求响应处理 两大部分,前者在 servlet 容器启动过程中完成,为后者的执行提供基本的运行环境,而后者则是 Spring MVC 的核心所在,负责接收请求到最终返回响应数据的复杂处理过程。 本篇章我们一起来探究 Spring MVC 在 web 环境下的容器初始化过程。Spring MVC 是建立在 Spring 基础组件之上的 MVC 框架,之前我们在分析 IoC 实现的时候,对于传统的容器初始化触发条件都是采用类似下面的方式: 1ApplicationCont...

阅读全文

Spring IoC 源码解析:循环依赖的探测与处理

Spring 为开发人员提供了极其灵活和强大的配置使用方式,在方便开发的同时也为容器的初始化过程带来了不确定性,本篇所要介绍的循环依赖就是其中之一,尤其在一些大型项目中,循环依赖的配置往往是我们不经意而为之的,幸好 Spring 能够在初始化的过程中探测到对象之间的循环依赖,并能够在一定程度上对其进行处理。 一. 什么是循环依赖以最简单的循环依赖举例,假设我们定义了两个类 A 和 B,如下: 123456789101112131415public class A { private String name; private B b; public A() { } public A(B b) { this...

阅读全文

Powered by hexo & Theme by hiero   Copyright © 2015-2018 浙ICP备 16010916  号,指 · 间 All Rights Reserved.