1. 程式人生 > >mybatis精講(四)--ObjectFactory

mybatis精講(四)--ObjectFactory

目錄

  • 前言
  • mybatis的ObjectFactory
  • 原始碼
    • setProperties
    •  create
    • instantiateClass
  • 使用場景
  • # 加入戰隊
    • 微信公眾號

前言

  • 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來實現了。在建立好物件後在去查詢資料進行填充。
    加入戰隊

# 加入戰隊

微信公眾號

相關推薦

mybatis()--ObjectFactory

目錄 前言 mybatis的ObjectFactory 原始碼 setProperties  create instantiateClass

Vue 基礎()

條件渲染 v-if v-else v-else-if 用 key 管理可複用的元素 v-show v-if vs v-show v-if 在 Vue 中我們可以通過 v-if 指令來判斷

Mybatis(一)---環境配置及架構梳理

目錄 簡介 ORM模型 Hibernate Ibatis 環境搭建 jar 配置 xml方式配置 程式碼方式配

Mybatis(二)---生命週期

目錄 回顧 SqlSessionFactoryBuilder SqlSessionFactory openSessionFromDataSource Executor

mybatis(三)--標籤及TypeHandler使用

目錄 話引 XML配置標籤 概覽 properties 子標籤property resource 程式注入

mybatis(五)--對映器元件

目錄 前言 標籤 select insert|update|delete 引數 resultMap cache 自定義快取

mybatis(六)--二級快取

目錄 簡介 配置 原始碼 CachingExecutor 缺點 自定義二級快取 簡介 上一章節我們簡單瞭解了二級快取的配置。今

第三百五十節,Python分布式爬蟲打造搜索引擎Scrapy—數據收集(Stats Collection)

ack 高效 所有 crawl resp spider 方法 啟動 定義 第三百五十四節,Python分布式爬蟲打造搜索引擎Scrapy精講—數據收集(Stats Collection) Scrapy提供了方便的收集數據的機制。數據以key/value方式存儲,值大多是

Redis 總結 看一篇成高手系統

本文圍繞以下幾點進行闡述 1、為什麼使用redis 2、使用redis有什麼缺點 3、單執行緒的redis為什麼這麼快 4、redis的資料型別,以及每種資料型別的使用場景 5、redis的過期策略以及記憶體淘汰機制 6、redis和資料庫雙寫一致性問題 7、如何應對快取穿透和快取雪崩問題 8

springboot整合mybatis的兩種方式的過程(含demo下載)

前言: spirngboot整合mybatis過程有兩種整合方式,一種就是通過xml檔案來寫sql,另外一種就是通過註解的方式來寫sql語句.但是不論哪種方式都首先需要引入一個最重要的jar包。那就是mybatis-spring-boot-starter這個包。這個包的部分

QT:控制元件)容器Containers Widgets

    Qt Creator有9種Containers Widgets,如圖:     Containers Widgets的Qt類和名稱介紹如下表:     控制元件類    &

系統分析師教程知識點之標準化知識

系統分析師 軟考系統分析師在2017上半年開考,整理了一些系統分析師教程知識點精講。 標準化知識 按照ISO/IEC9126,軟件質量模型包括6個質量特性和21個質量子特性: SW-CMM軟件采辦能力成熟度模型:關註的是軟件購買者的軟件能力成熟度; 而CMM關註的是軟件

收藏版:java常見面試題目視頻教程!

收藏版:java常見面試題目精講視頻教程! 首先給大家愛介紹一下java的就業前景,Java語言是一門很實用的語言,在互聯網的應用十分廣泛,目前采用JAVA語言開發的網站也越來越多,所以對Java開發人才的需求量也是倍增。從人才需求方面看,軟件開發是當下的發展趨勢,而我國的軟件開發人才極為缺

幹貨!java經典面試套路視頻教程免費分享!

幹貨!java經典面試套路精講視頻教程免費分享! 不管我們學了什麽專業,學會了哪些技能,結果就是為了就業,就業就需要面試,而在面試過程中,面試技巧是一項很重要的能力。我們java工程師在面試的時候都會遇到技術方面的面試問題,那麽這個時候應該怎麽解決呢?今天給大家分享一個java經典面試套路精

筆記 屬性 權限 用戶 臨時權限(猿課1.6-2.0)

linux1.6 文件或目錄屬性信息ls -l 看目錄的詳細信息- 普通文件 d 目錄 s 進程間通信 c 字符設備 b 塊設備 l 軟連接(快捷方式) p管道文件所屬主 所屬組 其他人 權限rwxls -li inode號ls -la 111 有兩個子目錄 ls -lh 根據文件大小更改單位1.7 chmo

免費視頻教程:Java經典面試課程

免費視頻教程:Java經典面試精講課程 Java是Sun公司推出的一種編程語言。它是一種通過解釋方式來執行的語言,語法規則和C++類似。同時,Java也是一種跨平臺的程序設計語言。 本教程主要給大家講解了Java七大外企經典面試套路,精選多年來名企在各地的Java筆試真題、面試經

第三百三十八節,Python分布式爬蟲打造搜索引擎Scrapy—深度優先與廣度優先原理

.com nbsp 網站 color -1 廣度 spa .cn png 第三百三十八節,Python分布式爬蟲打造搜索引擎Scrapy精講—深度優先與廣度優先原理 網站樹形結構 深度優先 是從左到右深度進行爬取的,以深度為準則從左到右的執行 第三百三十

第三百五十三節,Python分布式爬蟲打造搜索引擎Scrapy—scrapy的暫停與重啟

ctrl+ 裏的 dir 其中 重啟 requests 引擎 image .cn 第三百五十三節,Python分布式爬蟲打造搜索引擎Scrapy精講—scrapy的暫停與重啟 scrapy的每一個爬蟲,暫停時可以記錄暫停狀態以及爬取了哪些url,重啟時可以從暫停狀態開始

第三百五十五節,Python分布式爬蟲打造搜索引擎Scrapy—scrapy信號詳解

第一個 如果 -c stopped lin 支持 idle 資源 spider 第三百五十五節,Python分布式爬蟲打造搜索引擎Scrapy精講—scrapy信號詳解 信號一般使用信號分發器dispatcher.connect(),來設置信號,和信號觸發函數,當捕獲到信號

第三百五十八節,Python分布式爬蟲打造搜索引擎Scrapy—將bloomfilter(布隆過濾器)集成到scrapy-redis中

分布式爬蟲 times 操作 加載 ger 目錄 需要 ini space 第三百五十八節,Python分布式爬蟲打造搜索引擎Scrapy精講—將bloomfilter(布隆過濾器)集成到scrapy-redis中,判斷URL是否重復 布隆過濾器(Bloom Filte