MyBatis源码解读 | MyBatis抽象工厂 —— ObjectFactory详解

145 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第7天,点击查看活动详情

MyBatis源码解读系列文章

  1. MyBatis源码解读 | 使用ScriptRunner执行SQL脚本文件
  2. MyBatis源码解读 | 使用SqlRunner操作数据库

ObjectFactory概述

ObjectFactoryMyBatis中的对象工厂。ObjectFactory接口只有一个默认的实现,即DefaultObjectFactory

代码示例

使用ObjectFactory创建对象的案例代码如下:

ObjectFactory objectFactory = new DefaultObjectFactory();
List<Integer> list = objectFactory.create(List.class);
list.addAll(Arrays.asList(1, 2, 3));
System.out.println(list);

DefaultObjectFactory实现类支持通过接口的方式创建对象。例如当我们指定创建java.util.List实例时,实际上创建的是java.util.ArrayList对象。

DefaultObjectFactory支持的接口:

  • java.util.List --> java.util.ArrayList
  • java.util.Collection --> java.util.ArrayList
  • java.lang.Iterable --> java.util.ArrayList
  • java.util.Map --> java.util.HashMap
  • java.util.SortedSet --> java.util.TreeSet
  • java.util.Set --> java.util.HashSet

某些场景下,在得到映射结果之前我们可能需要处理一些逻辑,或者在执行该类的有参构造方法时,在传入参数之前,要对参数进行一些处理,这时我们可以通过自定义ObjectFactory来实现。

自定义ObjectFactory代码示例:

public class CustomObjectFactory extends DefaultObjectFactory {
    @Override
    public Object create(Class type) {
        if (Objects.equals(type, User.class)) {
            // 实例化 User 类
            User user = super.create(User.class);
            // 需要处理的业务逻辑
            user.setId(UUID.randomUUID().toString());
            return user;
        }
        return super.create(type);
    }
}

我们实现自定义ObjectFactory只需要继承DefaultObjectFactory然后重写create()方法即可。

自定义ObjectFactory后还需要在MyBatis配置文件中通过<objectFactory >标签配置自定义的ObjectFactory,具体如下:

<objectFactory type="com.mybatis.test.CustomObjectFactory">
    <property name="someProperty" value="value1" />
</objectFactory>

好了,关于ObjectFactory我们就介绍这些内容。

如果觉得文章写得还凑合,还麻烦您动动小手帮忙点个赞呗。您的支持是我更文的动力。目前在写的系列有下面几个系统:

  • MyBatis源码解读
  • 设计模式
  • 一起学Three.js
  • Spring Boot
  • Spring Cloud

都是一些平时工作中用到的知识点的个人总结和学习笔记。