前言

  • 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来实现了。在创建好对象后在去查询数据进行填充。

    加入战队

# 加入战队

微信公众号

mybatis精讲(四)--ObjectFactory的更多相关文章

  1. mybatis精讲(三)--标签及TypeHandler使用

    目录 话引 XML配置标签 概览 properties 子标签property resource 程序注入 settings 别名 TypeHandler 自定义TypeHandler EnumTyp ...

  2. mybatis精讲(五)--映射器组件

    目录 前言 标签 select insert|update|delete 参数 resultMap cache 自定义缓存 # 加入战队 微信公众号 前言 映射器之前我们已经提到了,是mybatis特 ...

  3. Mybatis精讲(一)---环境配置及架构梳理

    目录 简介 ORM模型 Hibernate Ibatis 环境搭建 jar 配置 xml方式配置 代码方式配置 两种方式对比 Mybatis结构 源码解读xml环境加载 映射器解读 Ibatis # ...

  4. Mybatis精讲(二)---生命周期

    目录 回顾 SqlSessionFactoryBuilder SqlSessionFactory openSessionFromDataSource Executor SqlSession Mappe ...

  5. mybatis精讲(六)--二级缓存

    目录 简介 配置 源码 CachingExecutor 自定义二级缓存 # 加入战队 微信公众号 简介 上一章节我们简单了解了二级缓存的配置.今天我们详细分析下二级缓存以及为什么不建议使用二级缓存. ...

  6. mybatis精讲(七)--动态sql

    目录 常用标签 if元素 choose元素 trim元素 forearch bind元素 在我们传统的开发中我们会通过拼接sql达到数据库的操作.java中的拼接不仅效率低下而且代码很长不易维护.而M ...

  7. 【C++自我精讲】基础系列四 static

    [C++自我精讲]基础系列四 static 0 前言 变量的存储类型:存储类型按变量的生存期划分,分动态存储方式和静态存储方式. 1)动态存储方式的变量,生存期为变量所在的作用域.即程序运行到此变量时 ...

  8. 第三百六十四节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的mapping映射管理

    第三百六十四节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的mapping映射管理 1.映射(mapping)介绍 映射:创建索引的时候,可以预先定义字 ...

  9. 第三百五十四节,Python分布式爬虫打造搜索引擎Scrapy精讲—数据收集(Stats Collection)

    第三百五十四节,Python分布式爬虫打造搜索引擎Scrapy精讲—数据收集(Stats Collection) Scrapy提供了方便的收集数据的机制.数据以key/value方式存储,值大多是计数 ...

随机推荐

  1. 解开HTTPS的神秘面纱

    在说HTTP前,一定要先介绍一下HTTP,这家伙应该不用过多说明了,大家每天都在用,每一次HTTP请求,都是一次TCP连接.遗憾的是,请求的内容在TCP报文中是明文传输的,任何人截取到请求都可以读取其 ...

  2. WinDag基础1

    建立调试会话 用户层调试会话的建立 直接创建进程并调试 附加到已经打开的进程 侵入式附加:接管正在运行的进程,可以进行调试 非侵入式附加:只能读取进程信息,不能接收目标进程的调试事件 通常情况下一个程 ...

  3. vue学习笔记(一)入门

    前言 随着前端不断的壮大,许多公司对于前端开发者的需求也越来越多了,作为一名优秀的前端工程师,如果连vue和react都不会的话,那真是out了,为什么那么说呢?这是我在招聘网站上截的一张图,十家公司 ...

  4. 20191106-使用pyttsx对文本进行语音输出

    实现pyttsx文字转语音的开源库调用 参考: 1.  https://blog.csdn.net/liuyubo23/article/details/83990532 2.  https://www ...

  5. Redis的使用--基本数据类型的操作命令和应用场景

    echo编辑整理,欢迎转载,转载请声明文章来源.欢迎添加echo微信(微信号:t2421499075)交流学习. 百战不败,依不自称常胜,百败不颓,依能奋力前行.--这才是真正的堪称强大!!! Red ...

  6. 洛谷P5522 【[yLOI2019] 棠梨煎雪】

    区间操作考虑用线段树维护. 建\(n*2\)棵线段树,前\(n\)棵线段树维护每个串的第i位是否是0. 后\(n\)棵线段树维护每个串的第i位是否是1. 如果是问号的话,直接跳过就好(通过1和0能看出 ...

  7. nginx篇最初级用法之lnmp环境搭建

    这里m使用mariadb 需要下列软件列表: nginx mariadb 数据库客户端软件   mariadb-server   数据库服务器软件   mariadb-devel  其他客户端软件的依 ...

  8. [考试反思]1001csp-s模拟测试(b):逃离

    如你所见,b组题,除了NC乱入直奔T2抢了我一个首杀以外A层学过FFT的人都没有参加. 竞争压力很小,题又简单,所以就造就了6个AK. 然而并不计入总分,我仍然稳在第二机房. T1lyl16分钟切掉我 ...

  9. NOIP模拟赛 华容道 (搜索和最短路)蒟蒻的第一道紫题

    题目描述 小 B 最近迷上了华容道,可是他总是要花很长的时间才能完成一次.于是,他想到用编程来完成华容道:给定一种局面, 华容道是否根本就无法完成,如果能完成, 最少需要多少时间. 小 B 玩的华容道 ...

  10. 使用springcloud开发测试问题总结

    使用springcloud开发测试 如下描述的问题,没有指明是linux部署的,都是在windows开发环境上部署验证发现的. Issue1配置客户端不使用配置中心 问题描述: 配置客户端使用配置中心 ...