目录
前言
mybatis 的 ObjectFactory
源码
- setProperties
- create
- instantiateClass
使用场景
# 加入战队
微信公众号
前言
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 来实现了. 在创建好对象后在去查询数据进行填充.
加入战队
# 加入战队
微信公众号
来源: https://www.cnblogs.com/zhangxinhua/p/11968765.html