mybatis中使用到的设计模式
Mybatis中使用到了哪些设计模式呢?下面就简单的来介绍下:
1.构造者模式:
构造者模式是在mybatis初始化mapper映射文件的过程中,为<cache>节点创建Cache对象的方式就是构造者模式。其中CacheBilder为建造者角色,Cache对象是产品角色,可以看CacheBuilder的源码来理解:
// 该类就是构造者
public class CacheBuilder {
// 这几个属性就是为生成产品对象需要的字段
private String id;
private Class<? extends Cache> implementation;
private List<Class<? extends Cache>> decorators;
private Integer size;
private Long clearInterval;
private boolean readWrite;
private Properties properties; public CacheBuilder(String id) {
this.id = id;
this.decorators = new ArrayList<Class<? extends Cache>>();
}
// 以下这几个方法就是构造者在生成产品对象时,需要使用到的几个具体模块方法。可以根据这几个方法的不同组合,生成不同的Cache对象
public CacheBuilder implementation(Class<? extends Cache> implementation) {
this.implementation = implementation;
return this;
} public CacheBuilder addDecorator(Class<? extends Cache> decorator) {
if (decorator != null) {
this.decorators.add(decorator);
}
return this;
} public CacheBuilder size(Integer size) {
this.size = size;
return this;
} public CacheBuilder clearInterval(Long clearInterval) {
this.clearInterval = clearInterval;
return this;
} public CacheBuilder readWrite(boolean readWrite) {
this.readWrite = readWrite;
return this;
} public CacheBuilder properties(Properties properties) {
this.properties = properties;
return this;
}
// 这个方法就是构造者生成产品的具体方法 返回的Cahce对象就是产品角色
public Cache build() {
setDefaultImplementations();
Cache cache = newBaseCacheInstance(implementation, id);
setCacheProperties(cache);
if (PerpetualCache.class.equals(cache.getClass())) { // issue #352, do not apply decorators to custom caches
for (Class<? extends Cache> decorator : decorators) {
cache = newCacheDecoratorInstance(decorator, cache);
setCacheProperties(cache);
}
cache = setStandardDecorators(cache);
}
return cache;
}
}
2 装饰器模式
Cache接口的实现有多个,但是大部分都是装饰器,只有PerpetualCache提供了Cache接口的基本实现,其他的装饰器都是在PerpetualCache的基础上提供了一些额外的功能,通过各种组合后满足一个特定的需求。如图:
先看下被装饰者PerpetualCache的源码部分:
private String id; // cache对象的唯一标识
// 底层使用HashMap来保存缓存信息
private Map<Object, Object> cache = new HashMap<Object, Object>(); public PerpetualCache(String id) {
this.id = id;
} public String getId() {
return id;
} public int getSize() {
return cache.size();
} public void putObject(Object key, Object value) {
cache.put(key, value);
}
然后再看LruCache这个装饰器:
private final Cache delegate; // 被装饰的底层cache对象
private Map<Object, Object> keyMap; // LinkedHashMap 用于记录key最近的使用情况
private Object eldestKey; // 记录最少被使用的缓存项的key public LruCache(Cache delegate) {
this.delegate = delegate;
setSize(1024);
}
3 工厂方法模式
mybatis中DataSource的创建使用了工厂方法模式,那么有哪些类在该模式中扮演了哪些角色呢?
工厂接口(Factory):DataSourceFactory扮演工厂接口角色
具体工厂类(ConcreteFactory):UnpooledDataSourceFactory和PooledDataSourceFactory
产品接口角色(Product):java.sql.DataSource
具体产品类角色(ConcreteFactory):UnpooledDataSource和PooledDataSource
可以用一张图来表示这些关系和角色:
mybatis中使用到的设计模式的更多相关文章
- JDK、Spring和Mybatis中使用到的设计模式
一.JDK中的设计模式 (1)结构性模式 1.适配器模式 java.util.Arrays#asList() java.io.InputStreamReader(InputStream) java.i ...
- Mybatis 中经典的 9 种设计模式!面试可以吹牛了
虽然我们都知道有23个设计模式,但是大多停留在概念层面,真实开发中很少遇到.Mybatis源码中使用了大量的设计模式,阅读源码并观察设计模式在其中的应用,能够更深入的理解设计模式. Mybatis至少 ...
- Mybatis中9种经典的设计模式!你知道几个?
虽然我们都知道有23个设计模式,但是大多停留在概念层面,真实开发中很少遇到.Mybatis源码中使用了大量的设计模式,阅读源码并观察设计模式在其中的应用,能够更深入的理解设计模式. Mybatis至少 ...
- [原创]关于mybatis中一级缓存和二级缓存的简单介绍
关于mybatis中一级缓存和二级缓存的简单介绍 mybatis的一级缓存: MyBatis会在表示会话的SqlSession对象中建立一个简单的缓存,将每次查询到的结果结果缓存起来,当下次查询的时候 ...
- Java开发中的23种设计模式详解(转)
设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...
- 记录一次bug解决过程:mybatis中$和#的使用
一.总结 mybatis中使用sqlMap进行sql查询时,经常需要动态传递参数.动态SQL是mybatis的强大特性之一,也是它优于其他ORM框架的一个重要原因.mybatis在对sql语句进行预编 ...
- mybatis中#{}与${}的差别(如何防止sql注入)
默认情况下,使用#{}语法,MyBatis会产生PreparedStatement语句中,并且安全的设置PreparedStatement参数,这个过程中MyBatis会进行必要的安全检查和转义. # ...
- mybatis 中的where标签
mybatis中的where标签可以去除 开头的 and 或者 or 但是放在后面的不行 失败的: <select id="countNotesByParam" parame ...
- Mybatis中SqlMapper配置的扩展与应用(3)
隔了两周,首先回顾一下,在Mybatis中的SqlMapper配置文件中引入的几个扩展机制: 1.引入SQL配置函数,简化配置.屏蔽DB底层差异性 2.引入自定义命名空间,允许自定义语句级元素.脚本级 ...
随机推荐
- 【小o地图Excel插件版】计算两点间驾车路径,获取途径道路、驾车距离、耗时等信息
小o地图Excel插件版:一款基于Excel软件开发的地图软件,提供基于Excel表格进行地理数据挖掘.地理数据分析.地图绘制.地图图表等功能的工具类软件.具有易用.高效.稳定的特点,能够满足地理数据 ...
- .NET平台下使用Redis
using DBI.SaaS.Web.Models.Args; using Rafy; using StackExchange.Redis; using System; using System.Co ...
- response.write
response.write(chunk[, encoding][, callback])# 查看英文版 chunk <string> | <Buffer> encoding ...
- Android冷启动优化
我们知道新打开一个应用的时候,会出现短暂的白屏或者黑屏,严重影响到我们的用户体验,其实这个过程是launcher启动新进程,进程中启动activity时,会先绑定window,然后使用默认的windo ...
- 一幅图,看懂中国CMMI
以下数据由Fancier凡奉信息根据历年CMMI Institute公布的CMMI评估结果的汇总整理.数据跨度2008-2017年,包含对中国CMMI与全球CMMI的不同等级.版本的统计.
- 【English】一、专治各种英语不服
一.前言 英语虽然不是使用人数最多的语言,但是...谁叫我是一名码农且英语垃圾呢. 二.开始 1. read sb sth = read sth for sb read sb sth 是双宾语结构. ...
- Jmeter设置代理,抓包之app请求
步骤: 1. Jmeter选择测试计划,添加线程组,添加http请求,添加监听器-察看结果树 2. 添加http代理服务器,右键添加非测试元件-添加http代理服务器 3. 端口改为8889,目标控制 ...
- ASP.NET Core 入门教程 7、ASP.NET Core MVC 分部视图入门
一.前言 1.本教程主要内容 ASP.NET Core MVC (Razor)分部视图简介 ASP.NET Core MVC (Razor)分部视图基础教程 ASP.NET Core MVC (Raz ...
- Git命令备忘
最近在用Git,查了点相关资料,逻辑依然不太明了,先整理一部分备忘,以后补充 一.本地Git与Github/码云的关联 1. 设置本地用户名,邮箱 git config --global user.n ...
- 报错:library not found for -lstdc++.6.0.9
在Xcode 10开发中, 报错:library not found for -lstdc++.6.0.9 解决方案:将Xcode9的libstdc++6.0.9.tbd拷贝到Xcode10中使用 X ...