mybatis精講(四)--ObjectFactory

前言

  • 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作的補救措施是在報錯時候添加獲取私有的權限。微信

  • 若是不爲空,則說明須要按照指定類型的參數的構造器去構造mybatis

constructor = type.getDeclaredConstructor(constructorArgTypes.toArray(new Class[constructorArgTypes.size()]));
  • 上面這段代碼就是獲取指定類型的構造器。而後拿到構造器後再根據對應的參數進行實例化。函數

  • 總結一句話就是代用符合的構造器進行實例化對象。spa

使用場景

  • ObjectFactory這個類重要性不言而喻,可是咱們須要定製的場景卻很少。由於他的功能很單一,就是實例化對象。
  • 只有少數狀況,咱們須要控制對象生成後得作一些額外的操做的時候咱們才須要重寫factory。
  • 好比在學校系統中,咱們學生除了有基礎信息,咱們還想臨時添加一個成績的屬性用來表示最近一次成績總分。這個時候咱們就能夠經過自定義ObjectFactory來實現了。在建立好對象後在去查詢數據進行填充。
    加入戰隊

# 加入戰隊

微信公衆號

微信公衆號

相關文章
相關標籤/搜索