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