前言
- ObjectFactory是什么有些人可能並不知道。沒關系今天我們來看看這個類的作用。首先他是用來創建mybatis結果返回集的。通過它我們能控制創建返回集的節點。
mybatis的ObjectFactory
- 這個類是通過mybatis-config.xml中配置的。提供了
objectFactory
標簽給我們配置的。在Configuration
中有如下代碼
protected ObjectFactory objectFactory = new DefaultObjectFactory();
- 上面的代碼都能看懂。表示mybatis中默認的結果創建工廠是
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);
}
- objectFactory的作用就是用於創建對象。我們正常不需要擴展他。下面我們來看看他的源碼
源碼
setProperties
- 在加載Mybatis的時候就會加載額外配置的屬性。這里在上面的方法注釋上說的已經很清楚了。
create
- objectFactory方法中的create實際上工作的都是
instantiateClass
.
private <T> T instantiateClass(Class<T> type, List<Class<?>> constructorArgTypes, List<Object> constructorArgs);
instantiateClass
-
首先如果沒有構造參數和類型的話。通過
constructor = type.getDeclaredConstructor();
獲取到構造器。然后通過次構造器進行實例化對象。這里有可能會被私有化,mybatis做的補救措施是在報錯時候添加獲取私有的權限。 -
如果不為空,則說明需要按照指定類型的參數的構造器去構造
constructor = type.getDeclaredConstructor(constructorArgTypes.toArray(new Class[constructorArgTypes.size()]));
-
上面這段代碼就是獲取指定類型的構造器。然后拿到構造器后再根據對應的參數進行實例化。
-
總結一句話就是代用符合的構造器進行實例化對象。
使用場景
- ObjectFactory這個類重要性不言而喻,但是我們需要定制的場景卻不多。因為他的功能很單一,就是實例化對象。
- 只有少數情況,我們需要控制對象生成后得做一些額外的操作的時候我們才需要重寫factory。
- 比如在學校系統中,我們學生除了有基礎信息,我們還想臨時添加一個成績的屬性用來表示最近一次成績總分。這個時候我們就可以通過自定義ObjectFactory來實現了。在創建好對象后在去查詢數據進行填充。
加入戰隊