1. 程式人生 > >Mybatis外掛原理和執行流程

Mybatis外掛原理和執行流程

外掛:
外掛存在的目的就相當於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方法 最後執行真正的目標方法
一張圖來理解執行順序:


這裡寫圖片描述
總結:
建立動態代理的時候 是按照外掛配置順序建立層層代理物件
執行目標方法,是按逆向順序執行的