Mybatis_review之配置文件中的objectFactory节点内容说明

Mybatis中有一个默认的创建类的对象,名字叫做DefaultObjectFactory,这个类用于负责创建对象实体类。从这个类的外部看,这个类的主要作用就是根据一个类的类型得到该类的一个实体对象,比如,我们给他一个Tiger的type,他将会给我们一个Tiger的实体对象,我们给他一个java.lang.List对象,他将会给我们一个List的实体对象。这个其实从它的名字上就能看出来。

这个类在官方文档中介绍到DefaultObjectFactory这个类的对象做的事情是非常少的,仅仅是创建,并且初始化一个类的实例。既然称之为工厂,里面就应该可以封装更多的复杂逻辑,从而形成一个工厂的核心能力。那么应该如何扩展呢?

在Mybatis的配置文件中,提供了一个objectFactory的节点,通过这个节点,我们可以将默认的工厂配置为我们自己的工厂实现:

<span style="font-family:KaiTi_GB2312;font-size:18px;"><objectFactory type="com.samsung.mybatis.ExampleObjectFactory">
  <property name="someProperty1" value="1100"/>
  <property name="someProperty9" value="9100"/>
</objectFactory>
</span>

通过上面的配置,我们就将上面工厂的实现类从DefaultObjectFactory变成了我们自己实现的ExampleObjectFactory,面是这个类的简单的一个实现:

<span style="font-family:KaiTi_GB2312;font-size:18px;">package com.samsung.mybatis;

import java.util.Collection;
import java.util.Iterator;
import java.util.Properties;

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

public class ExampleObjectFactory extends DefaultObjectFactory {

    public Object create(Class type) {
        if(type.equals(Tiger.class)){
            Tiger obj= (Tiger)super.create(type);
            obj.setAge(1000);
            obj.setName("chenzw_objectFactory");
            obj.setWeight(73.4);
            return obj;
        }
        return super.create(type);
    }

    public void setProperties(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);
    }

    public <T> boolean isCollection(Class<T> type) {
        return Collection.class.isAssignableFrom(type);
    }
}
</span>

下面简单的看一下这几个方法都是干什么的,通过debug我们可以得到下面的结论:

1)      Create(Type,type) 通过接受一个type类型,得到该对象的一个实例,调用的是对象的无参构造函数,内部实现毫无疑问就是使用java的反射,或者是使用了CGLIB抑或是JAVA的ASSIST。

2)      setProperties(Properties properties)方法,对在节点中配置的property内容进行了加载,可以通过传入的属性文件内容影响程序逻辑,这个跟容器对web.xml的解析的原理是差不多的,原理也就是XML解析形成对象,然后以参数的方式传递到方法中。

3)      isCollection()这个方法可以方便当前类中的调用,可以用于判断要生成的这个对象是不是集合对象,我们应该记住这种判断是否是集合类的判断方式,用在自己的代码中:Collection.class.isAssignableFrom(type);


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值