mybatis - plugin(插件)

mybatis插件

mybatis源碼寫的極好,mybatis屬於相對輕量級的orm框架,包含的功能並無太多,較容易感覺它的設計之美,因此用博客的方式進行記錄;spring


mybatis插件在四處有使用到:sql

  1. 對sql入參 prameterHandler進行插件化處理
  2. 對sql出參result進行插件化處理
  3. 對stamentHandler進行插件化處理
  4. 對executor進行插件化處理;

mybatis的插件與平時所熟知的攔截器和過濾器相似,但設計並不相同,譬如:mybatis

  1. springmvc的HandlerInterceptor接口:攔截器實現類功能比較單一,並不參與調用鏈的調度,比較簡單的一組接口的實現類;
  2. 過濾器:- 責任鏈模式,每一個filter處理的時候入參中有chain對象,在執行完filter中的before後將控制權再交回給chain,由chain進行調度下一個before;而後調用鏈如圖:

  • mybatis中的插件實現了Interceptor接口,其實現的方式屬於裝飾器模式; mvc

  • 將執行插件的target交給插件,插件返回一個代理對象;將該代理對象傳給下一個插件,進行裝飾框架

  • 引入Plugin對象,將target和插件this傳給Pluginthis


  • 對target進行包裝,將插件功能包裝在代理對象中 插件

  • 對target進行包裝,經過cglib對target進行代理;設計

  • 傳入的InvocationHandler是Plugin自己; 3d

  • 當調用target方法時,進入Plugin中的invoke方法; 代理

  • 這時才真正的對target方法有選擇性的調用攔截器;

  • 而攔截器中的實現只須要關注攔截邏輯的處理,由於target中的方法調用交給Invocation對象中調用;

單拿出mybatis中的插件進行表述的緣由是,感受設計的仍是頗有意思的;擴展性很好,同時有別於其它的攔截器和過濾器的實現;

相關文章
相關標籤/搜索