logo头像

学如逆水行舟,不进则退!!!

文章目录

mybatis精讲(四)--ObjectFactory

本文于600天之前发表,文中内容可能已经过时。

[TOC]

前言

  • ObjectFactory是什么有些人可能并不知道。没关系今天我们来看看这个类的作用。首先他是用来创建mybatis结果返回集的。通过它我们能控制创建返回集的节点。

mybatis的ObjectFactory

  • 这个类是通过mybatis-config.xml中配置的。提供了objectFactory标签给我们配置的。在Configuration中有如下代码

protected ObjectFactory objectFactory = new DefaultObjectFactory();
  • 上面的代码都能看懂。表示mybatis中默认的结果创建工厂是DefaultObjectFactory

public interface ObjectFactory {

  /**
   * 设置一些额外的属性 通过在mybatis-config.xml中objectFactory中properties属性标签设置 , 在初始化mybatis是就会触发这个方法
   */
  void setProperties(Properties properties);

  /**
   * 已默认的构造函数(无参构造)实例化对象
   * @return
   */
  <T> T create(Class<T> type);

  /**
   * 指定的构造函数实例化对象
   * @param type Object type
   * @param constructorArgTypes Constructor argument types
   * @param constructorArgs Constructor argument values
   * @return
   */
  <T> T create(Class<T> type, List<Class<?>> constructorArgTypes, List<Object> constructorArgs);

  /**
   * 判断是否是集合类型。只要能存储其他元素的都叫做集合
   * 内部通过isAssignableFrom判断是否继承值Collection类
   * @param type Object type
   * @return whether it is a collection or not
   * @since 3.1.0
   */
  <T> boolean isCollection(Class<T> type);

}
  • objectFactory的作用就是用于创建对象。我们正常不需要扩展他。下面我们来看看他的源码

源码

setProperties

  • 在加载Mybatis的时候就会加载额外配置的属性。这里在上面的方法注释上说的已经很清楚了。

## create

  • objectFactory方法中的create实际上工作的都是instantiateClass.
    private  <T> T instantiateClass(Class<T> type, List<Class<?>> constructorArgTypes, List<Object> constructorArgs);
    

instantiateClass

  • 首先如果没有构造参数和类型的话。通过constructor = type.getDeclaredConstructor();获取到构造器。然后通过次构造器进行实例化对象。这里有可能会被私有化,mybatis做的补救措施是在报错时候添加获取私有的权限。

  • 如果不为空,则说明需要按照指定类型的参数的构造器去构造


constructor = type.getDeclaredConstructor(constructorArgTypes.toArray(new Class[constructorArgTypes.size()]));
  • 上面这段代码就是获取指定类型的构造器。然后拿到构造器后再根据对应的参数进行实例化。

  • 总结一句话就是代用符合的构造器进行实例化对象。

使用场景

  • ObjectFactory这个类重要性不言而喻,但是我们需要定制的场景却不多。因为他的功能很单一,就是实例化对象。
  • 只有少数情况,我们需要控制对象生成后得做一些额外的操作的时候我们才需要重写factory。
  • 比如在学校系统中,我们学生除了有基础信息,我们还想临时添加一个成绩的属性用来表示最近一次成绩总分。这个时候我们就可以通过自定义ObjectFactory来实现了。在创建好对象后在去查询数据进行填充。
上一篇
坚持原创技术分享,您的支持将鼓励我继续创作!

评论系统未开启,无法评论!