Springboot整合MyBatis(六:Mybatis的xml配配置文件,详细配置之类对象工厂(objectFactory)查询是创建对象实例操作一下)

每次 MyBatis 创建结果对象的新实例时,它都会使用一个对象工厂(ObjectFactory)实例来完成实例化工作。 默认的对象工厂需要做的仅仅是实例化目标类,要么通过默认无参构造方法,要么通过存在的参数映射来调用带有参数的构造方法。 如果想覆盖对象工厂的默认行为,可以通过创建自己的对象工厂来实现

这是官网对其做的一个解释,说的意思是:我们在通过select语句查询数据库时,查询的结果集会映射到我们指定的javaBean上面。比如查一个集合List,那么集合里面的每一个元素在创建实例的时候,如果不设置,就会通过DefaultObjectFactory 类的下面两个方法创建实例(其中一个,要么无参构造函数,要么有参构造函数):

	public Object create(Class type) {
    return super.create(type);
  }
  public Object create(Class type, List<Class> constructorArgTypes, List<Object> constructorArgs) {
    return super.create(type, constructorArgTypes, constructorArgs);
  }

如果我们希望他在创建实例的时候,做一些动作,至于做什么动作,根据实际业务需求。
那么我们就来实操一把:

第一步、创建MyObjectFactory继承org.apache.ibatis.reflection.factory.DefaultObjectFactory并覆盖create方法,如果是有参构造函数,就覆盖有参构造函数,如果是无参构造函数,就覆盖无参构造函数

如果在覆盖的时候需要一些参数,可以通过在配置的时候,配置文件中的property标签进行传递。

package com.osy.config;

import org.apache.ibatis.reflection.factory.DefaultObjectFactory;

import java.util.List;

public class MyObjectFactory extends DefaultObjectFactory {
    @Override
    public <T> T create(Class<T> type) {
        System.out.println("生成实例【无参】");
        return super.create(type);
    }

    @Override
    public <T> T create(Class<T> type, List<Class<?>> constructorArgTypes, List<Object> constructorArgs) {
        System.out.println("生成实例【有参】");
        return super.create(type, constructorArgTypes, constructorArgs);
    }
    
	@Override
    public void setProperties(Properties properties) {
        // 这里的properties是通过配置文件传过来的
        Iterator iterator = properties.keySet().iterator();
        while (iterator.hasNext()) {
            String keyValue = String.valueOf(iterator.next());
            System.out.println(properties.getProperty(keyValue));
        }
        super.setProperties(properties);
    }
}

第二步、在配置文件中配置

	<objectFactory type="com.osy.config.MyObjectFactory">
        <property name="test" value="test"/>
    </objectFactory>

这里的property 标签的值会传递到setProperties方法中properties参数中。
至于这个有什么用,不清楚,要传递可以通过Properties传递,这里传递,确实不知道干什么的。

第三步、测试 随便查询一个:看控制台打印


随便查询一个:看控制台打印

生成实例【无参】
生成实例【有参】
生成实例【无参】
生成实例【有参】

为什么打印了两次?原因不明,待研究…

猜你喜欢

转载自blog.csdn.net/qq_42154259/article/details/106989761