1. 程式人生 > >Mybatis_review之配置檔案中的objectFactory節點內容說明

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);