mybatis原始碼分析 自定義外掛程式

2021-10-01 18:52:20 字數 1791 閱讀 1344

mybatis在四大元件(execurot,statementhandler,parameterhandler,resultsethandler)處提供了簡單易用的外掛程式擴充套件機制。mybatis支援對四大核心物件進行攔截,對mybatis來說外掛程式就是***,用來增強核心物件功能,增強功能的本質上是借助底層的動態**實現的。

編寫自定義外掛程式的時候我們需要通過實現mybatis外掛程式介面interceptor,新增註解@intercepts,可以在該註解中定義多個@signature對多個地方進行攔截,我們需要在@signature當中指定攔截的介面、方法名、攔截方法的入參(由於存在方法過載情況,需要來確定方法的唯一性);

同時實現其中包含的三個方法:

@component

@intercepts()

})public

class

mysqlinterceptor

implements

interceptor}}

//通過反射修改sql語句

field field = boundsql.

getclass()

.getdeclaredfield

("sql");

field.

setaccessible

(true);

field.

set(boundsql, msql)

;return invocation.

proceed()

;}//注意為了把這個***生成乙個**放到***鏈中

@override

public object plugin

(object target)

else

}//外掛程式初始化後呼叫,也只會呼叫一次,外掛程式配置的屬性從這裡設定進來

@override

public

void

setproperties

(properties properties)

}

interceptannotation:

@target()

@retention

(retentionpolicy.runtime)

public @inte***ce

interceptannotation

public

inte***ce

在呼叫方法select()後便會進過攔截 ,對sql處理完成了對資料許可權的處理。

plugin:

@override

public object invoke

(object proxy, method method, object[

] args)

throws throwable

// 如果不是,則呼叫原方法

return method.

invoke

(target, args);}

catch

(exception e)

}

invoke()方法首先會檢測被攔截方法是否配置在外掛程式的@signature註解中,若是,則執行外掛程式邏輯,否則則執行被攔截方法。外掛程式邏輯封裝在intercept中,該方法引數型別為invocation,invocation主要用於儲存目標類,方法及方法引數列表。

自定義屬性提取原始碼分析

原始碼分析基於android 5.0,自定義view的 黃色別墅使用示例如下 其中attrs標識customtitleview對應的節點屬性集合 obtainstyledattributes的作用是將attrs屬性集合中 指定的部分 的屬性進行封裝,屬於container的角色,呼叫過程如下 因此t...

模仿原始碼自定義ArrayList

最近看了下arraylist的原始碼,抽空根據arraylist的底層結構寫了乙個功能簡單無泛型的自定義arraylsit,幫助自己更好理解arraylist 其實現的底層資料結構為數object組,如下 自己實現乙個arraylist public class myarraylist public...

Mybatis 原始碼分析

mybatis解析 2 sqlsessionfactorybean 繼承了 initializingbean 介面,在bean解析的finishbeanfactoryinitialization 的方法對 initializingbean介面中的 afterpropertiesset 方法進行呼叫,...