Mybatis外掛原理和執行流程
阿新 • • 發佈:2019-01-25
外掛:
外掛存在的目的就相當於javaweb中的攔截器,可以攔截要操作的四大物件,包裝物件
額外新增內容,使得Mybatis的靈活性更強。
外掛原理
* 在四大物件建立的時候
* 1、每個創建出來的物件不是直接返回的,而是
* interceptorChain.pluginAll(parameterHandler);
* 2、獲取到所有的Interceptor(攔截器)(外掛需要實現的介面);
* 呼叫interceptor.plugin(target);返回target包裝後的物件
* 3、外掛機制,我們可以使用外掛為目標物件建立一個代理物件;AOP(面向切面)
* 我們的外掛可以為四大物件創建出代理物件;
* 代理物件就可以攔截到四大物件的每一個執行;
總結:
如果是外掛宣告攔截的物件,那麼就會plugin返回包裝類,為其建立一個代理物件,可以對指定方法進行攔截。
public Object pluginAll(Object target) {
for (Interceptor interceptor : interceptors) {
target = interceptor.plugin(target);
}
return target;
}
先來簡單介紹下四大物件
一張圖明白四大物件關係:
Executor //執行增刪改查操作
StatementHandler //處理sql語句預編譯,設定引數等相關工作;
ParameterHandler //設定預編譯引數用的
ResultSetHandler //處理結果集
四大物件每個建立的時候都有一個
注意:
每個物件建立的時候 都會呼叫所有外掛的plugin方法 對其進行包裝操作
interceptorChain.pluginAll(parameterHandler);
如果多個外掛對一個物件的方法進行攔截 就會產生層層攔截效果 第一個物件的動態代理物件傳給第二個外掛包裝
當執行目標方法的時候先呼叫第二個外掛的intercept 然後呼叫第一個外掛的intercept方法 最後執行真正的目標方法
一張圖來理解執行順序:
總結:
建立動態代理的時候 是按照外掛配置順序建立層層代理物件
執行目標方法,是按逆向順序執行的