Mybatis中的设计模式解读

本文深入探讨了Mybatis中运用的设计模式,包括构造者模式用于初始化mapper映射文件中的Cache对象,装饰器模式在Cache接口实现中的应用,工厂方法模式在DataSource创建中的体现,以及代理设计模式的部分源码解析。
摘要由CSDN通过智能技术生成

mybatis中的设计模式解读

Mybatis中使用到了哪些设计模式呢?

1.构造者模式:

构造者模式是在mybatis初始化mapper映射文件的过程中,为节点创建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

可以用一张图来表示这些关系和角色:
在这里插入图片描述

代理设计模式

部分源码:

 protected T newInstance(MapperProxy<T> mapperProxy) {
    //最终调用了这段代码"JDK动态代理
    return (T) Proxy.newProxyInstance(
    mapperInterface.getClassLoader(),
     new Class[] { mapperInterface }, 
     mapperProxy);
  }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值