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作的补救措施是在报错时候添加获取私有的权限。微信
若是不为空,则说明须要按照指定类型的参数的构造器去构造mybatis
constructor = type.getDeclaredConstructor(constructorArgTypes.toArray(new Class[constructorArgTypes.size()]));
上面这段代码就是获取指定类型的构造器。而后拿到构造器后再根据对应的参数进行实例化。函数
总结一句话就是代用符合的构造器进行实例化对象。spa