objectFactory标签给我们配置的。在Configuration中有如下代码
protected ObjectFactory objectFactory = new DefaultObjectFactory();
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);
}
instantiateClass.private <T> T instantiateClass(Class<T> type, List<Class<?>> constructorArgTypes, List<Object> constructorArgs);
首先如果没有构造参数和类型的话。通过constructor = type.getDeclaredConstructor();获取到构造器。然后通过次构造器进行实例化对象。这里有可能会被私有化,mybatis做的补救措施是在报错时候添加获取私有的权限。
如果不为空,则说明需要按照指定类型的参数的构造器去构造
constructor = type.getDeclaredConstructor(constructorArgTypes.toArray(new Class[constructorArgTypes.size()]));
上面这段代码就是获取指定类型的构造器。然后拿到构造器后再根据对应的参数进行实例化。
总结一句话就是代用符合的构造器进行实例化对象。

原文:https://www.cnblogs.com/zhangxinhua/p/11968765.html