mybatis執行過程深度解析(一)

2021-08-19 14:14:49 字數 2546 閱讀 9707

mybatis的執行分為兩大步:

1.讀取配置檔案快取到configuration物件中,用以建立sqlsessionfactory;

2.sqlsession的執行過程。

首先我們來說一下這個sqlsessionfactory構建;

首先我們要知道,sqlsessionfactory是乙個介面,而不是乙個實現類,mybatis給他提供了乙個預設的實現類org.apache.ibatis.session.defaults.defaultsqlsessionfactory。從原始碼中我們也能夠看出:

public sqlsessionfactory build(configuration config)
建立sqlsessionfactory的時候,是交給defaultsqlsessionfactory去執行的;同時在這裡,我們發現在建立sqlsessionfactory時,最重要的configuration物件;那我們接著看:

public sqlsessionfactory build(inputstream inputstream, string environment, properties properties)  catch (exception e)  finally  catch (ioexception e) 

}}

這個方法是呼叫剛才那個方法的方法,我們能夠找到 return build(parser.parse());在這裡呼叫的;然後繼續往上走,我們看到了xmlconfigbuilder這個類,他繼承了basebuilder的類;現在能夠知道了configuration物件是由xmlconfigbuilder建立的了吧。那他是怎麼建立的呢?接著繼續跟進:

public configuration parse() 

parsed = true;

parseconfiguration(parser.evalnode("/configuration"));

return configuration;

}

我們到xmlconfigbuilder類中找到了parse()方法,然後我們接著看parseconfiguration(parser.evalnode("/configuration"));這個方法是怎麼實現的:

private void parseconfiguration(xnode root)  catch (exception e) 

}

打眼一看感覺不少,其實這些只是做了一樣工作,解析xml對應的資訊;

propertieselement(root.evalnode("properties"));//屬性檔案,資料庫驅動配置?

typealiaseselement(root.evalnode("typealiases"));//型別方言,用於結果轉換

pluginelement(root.evalnode("plugins"));//外掛程式,可以配置不同時機的***

objectfactoryelement(root.evalnode("objectfactory"));//物件工廠,可以配置返回物件屬性

settingselement(root.evalnode("settings")); //全域性變數,快取,延遲載入等配置

environmentselement(root.evalnode("environments")); //環境變數,根據配置構建資料來源工廠,事務工廠

databaseidproviderelement(root.evalnode("databaseidprovider"));//資料庫提供標識id,多資料庫相容的時候用到

typehandlerelement(root.evalnode("typehandlers")); //型別處理器,主要是對結果集,型別轉換處理

到這裡我們就知道整個流程了,但是在這多說一下,那就是typehandler,因為這個解析過程很重要;

我們繼續跟進typehandlerelement(root.evalnode("typehandlers"));方法:

private void typehandlerelement(xnode parent) throws exception  else  else 

} else }}

}

從原始碼中,我們看出,他被註冊到了typehandlerregistry物件中去了,但這個物件怎麼來的,xmlconfigbuilder中並沒有定義它,那就只能是來自xmlconfigbuilder的父類basebuilder了,就是來自它,我們跟進看一下,

public abstract class basebuilder
this.typehandlerregistry = this.configuration.gettypehandlerregistry();通過這句**,我們能獲得:原來typehandlerregistry物件實際就是configuration單利的乙個屬性,所以我們可以通過configuration單利拿到typehandlerregistry物件,進而我們拿到所註冊的typehandler;

AOP執行過程解析

上篇寫了動態 這裡我們來看看aop吧 aop面向切面程式設計的核心思想就是動態 想要應用aop,主要有如下步驟 1 編寫乙個切面類,在類中寫一些方法,在些方法上配置連線點 before after around afterruturning afterthrowing 在連線點後寫明切點 excec...

Spark任務執行過程解析

spark submit sparksubmit main submit dorunmain runmain 通過反射,建立我們編寫的主類的例項物件,呼叫main方法 開始執行我們的 初始化sparkcontext物件 建立初始rdd 出發action運算元 提交job worker執行任務 任務結...

MyBatis 原始碼解讀 配置解析過程

我們從mybatis config.xml 開始。在第一節課的時候我們已經分析了核心配置了,大概明白了mybatis 有哪些配置項,和這些配置項的大致含義。這裡我們再具體看一下這裡面的標籤都是怎麼解析的,解析的時候做了什麼。sqlsessionfactory sqlsessionfactory ne...