Mybatis 插件原理解析

Mybati s作為⼀個應⽤⼴泛的優秀的ORM開源框架,這個框架具有強⼤的靈活性,在四⼤組件
(Executor、StatementHandler、ParameterHandler、ResultSetHandler)處提供瞭簡單易⽤的插 件擴展機制。
Mybatis對持久層的操作就是借助於四⼤核⼼對象。MyBatis⽀持⽤插件對四⼤核⼼對象進 ⾏攔截,對mybatis來說
插件就是攔截器,⽤來增強核⼼對象的功能,增強功能本質上是借助於底層的 動態代理實現的,換句話說,
MyBatis中的四⼤對象都是代理對象

在這裡插入圖片描述

MyBatis所允許攔截的⽅法如下:

  • 執⾏器Executor (update、query、commit、rollback等⽅法);
  • SQL語法構建器StatementHandler (prepare、parameterize、batch、updates query等⽅法);
  • 參數處理器ParameterHandler (getParameterObject、setParameters⽅法);
  • 結果集處理器ResultSetHandler (handleResultSets、handleOutputParameters等⽅法);

在四⼤對象創建的時候

  • 每個創建出來的對象不是直接返回的,⽽是interceptorChain.pluginAll(parameterHandler);
  • 獲取到所有的Interceptor (攔截器)(插件需要實現的接⼝);調⽤ interceptor.plugin(target);返回
  • target 包 裝後的對象
  • 插件機制,我們可以使⽤插件為⽬標對象創建⼀個代理對象;AOP (⾯向切⾯)我們的插件可 以為四⼤對象

創建出代理對象,代理對象就可以攔截到四⼤對象的每⼀個執⾏;
自定義插件攔截:

Intercepts ({//註意看這個⼤花括號,也就這說這⾥可以定義多個@Signature對多個地⽅攔截,都⽤這個攔截器
@Signature (type = StatementHandler .class , //這是指攔截哪個接⼝
method = "prepare",//這個接⼝內的哪個⽅法名,不要拼錯瞭
args = { Connection.class, Integer .class}), 這是攔截的⽅法的⼊參,按順序寫到
這,不要多也不要少,如果⽅法重載,可是要通過⽅法名和⼊參來確定唯⼀的
})
public class MyPlugin implements Interceptor {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
// //這⾥是每次執⾏操作的時候,都會進⾏這個攔截器的⽅法內
Override
public Object intercept(Invocation invocation) throws Throwable {
//增強邏輯
System.out.println("對⽅法進⾏瞭增強....");
return invocation.proceed(); //執⾏原⽅法
}
/**
* //主要是為瞭把這個攔截器⽣成⼀個代理放到攔截器鏈中
* ^Description包裝⽬標對象 為⽬標對象創建代理對象
* @Param target為要攔截的對象
* @Return代理對象
*/
Override
public Object plugin(Object target) {
System.out.println("將要包裝的⽬標對象:"+target);
return Plugin.wrap(target,this);
 }
/**獲取配置⽂件的屬性**/
//插件初始化的時候調⽤,也隻調⽤⼀次,插件配置的屬性從這⾥設置進來
Override
public void setProperties(Properties properties) {
System.out.println("插件配置的初始化參數:"+properties );
} }

到此這篇關於Mybatis 插件原理解析的文章就介紹到這瞭,更多相關Mybatis 插件原理內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: