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 方法進行呼叫,...