mybatis通过自定义objectfactory在结果对象创建的最初阶段(即调用构造器前/后)介入实例化过程,继承defaultobjectfactory并重写create方法可实现默认值设置、依赖注入或实例替换,需在mybatis-config.xml中注册。

MyBatis 利用自定义 ObjectFactory 控制 JavaBean 实例化行为,核心在于接管“结果对象创建”这一环节——不是在映射后做赋值,而是在 new 实例的那一刻就介入。默认的 DefaultObjectFactory 只负责调用构造方法(无参或带参),而自定义实现可在此基础上扩展初始化逻辑、注入依赖、设置默认值,甚至替换实例本身。
明确 ObjectFactory 的作用时机
它只在 MyBatis 将数据库一行记录转为 Java 对象的**最开始阶段**被调用,即:
- 执行
SELECT后拿到ResultSet - 解析完字段与属性映射(
resultMap或resultType) -
在调用构造器创建空对象前/后,由
ObjectFactory.create(...)方法完成实例生成 - 之后才进行字段赋值(setter 或字段反射)、嵌套对象组装等后续步骤
继承 DefaultObjectFactory 并重写关键方法
自定义类必须继承 org.apache.ibatis.reflection.factory.DefaultObjectFactory,重点覆写两个 create 方法:
-
create(Class<t> type)</t>:处理无参构造(如new UserBean()) -
create(Class<t> type, List<class> constructorArgTypes, List<object> constructorArgs)</object></class></t>:处理有参构造(如new UserBean(1, "Tom"))
注意:不建议直接实现 ObjectFactory 接口,因为 DefaultObjectFactory 已封装了构造器查找、私有构造器可访问性处理、异常包装等底层细节,继承它更安全可靠。
在 create 方法中插入定制逻辑
你可以在调用 super.create(...) 前后添加任意初始化代码。常见做法包括:
-
创建后增强:先调用
super.create(...)得到实例,再设默认值或执行初始化方法 - 条件替换实例:根据类型或参数决定返回代理对象、缓存对象或特殊子类
-
统一注入基础属性:例如自动设置
createTime、tenantId等多租户/审计字段
示例片段:
public class CustomObjectFactory extends DefaultObjectFactory {@Override
public
T instance = super.create(type);
if (instance instanceof BaseEntity) {
((BaseEntity) instance).setCreateTime(new Date());
}
return instance;
}
}
在 mybatis-config.xml 中注册并传参
配置需放在 <configuration></configuration> 根节点下,且必须在 <environments></environments> 之前:
其中 setProperties(Properties) 方法会在工厂初始化时被自动调用,可用于读取配置项,实现行为开关或参数化控制。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











