mybatis精讲(四)--ObjectFactory

前言

  • 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作的补救措施是在报错时候添加获取私有的权限。微信

  • 若是不为空,则说明须要按照指定类型的参数的构造器去构造mybatis

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

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

使用场景

  • ObjectFactory这个类重要性不言而喻,可是咱们须要定制的场景却很少。由于他的功能很单一,就是实例化对象。
  • 只有少数状况,咱们须要控制对象生成后得作一些额外的操做的时候咱们才须要重写factory。
  • 好比在学校系统中,咱们学生除了有基础信息,咱们还想临时添加一个成绩的属性用来表示最近一次成绩总分。这个时候咱们就能够经过自定义ObjectFactory来实现了。在建立好对象后在去查询数据进行填充。
    加入战队

# 加入战队

微信公众号

微信公众号

相关文章
相关标签/搜索