簡述Mybatis的插件運行原理,以及如何編寫一個插件?

插件原理:在四大對象創建的時候
 1、每個創建出來的對象不是直接返回的,而是
      interceptorChain.pluginAll(parameterHandler);
 2、獲取到所有的Interceptor(攔截器)(插件需要實現的接口);
      調用interceptor.plugin(target);返回target包裝後的對象
 3、插件機制,我們可以使用插件爲目標對象創建一個代理對象;AOP(面向切面)
       我們的插件可以爲四大對象創建出代理對象;
       代理對象就可以攔截到四大對象的每一個執行;

 

編寫插件

1、創建插件類實現interceptor接口並且使用註解標註攔截對象與方法

package city.albert;

/**
 * @author niunafei
 * @function
 * @email [email protected]
 * @date 2020/6/11  6:08 PM
 */

import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.plugin.*;
import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.RowBounds;

import java.lang.reflect.Method;
import java.util.Properties;

/**
 * 註解聲明mybatis當前插件攔截哪個對象的哪個方法
 * <p>
 * type表示要攔截的目標對象 Executor.class StatementHandler.class  ParameterHandler.class ResultSetHandler.class
 * method表示要攔截的方法,
 * args表示要攔截方法的參數
 *
 * @author niuanfei
 */
@Intercepts({
        @Signature(type = Executor.class, method = "query",
                args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class})})
public class TestInterceptor implements Interceptor {

    /**
     * 攔截目標對象的目標方法執行
     *
     * @param invocation
     * @return
     * @throws Throwable
     */
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        //被代理對象
        Object target = invocation.getTarget();
        //代理方法
        Method method = invocation.getMethod();
        //方法參數
        Object[] args = invocation.getArgs();
        // do something ...... 方法攔截前執行代碼塊
        //執行原來方法
        Object result = invocation.proceed();
        // do something .......方法攔截後執行代碼塊
        return result;
    }

    /**
     * 包裝目標對象:爲目標對象創建代理對象
     *
     * @param target
     * @return
     */
    @Override
    public Object plugin(Object target) {
        System.out.println("MySecondPlugin爲目標對象" + target + "創建代理對象");
        //this表示當前攔截器,target表示目標對象,wrap方法利用mybatis封裝的方法爲目標對象創建代理對象(沒有攔截的對象會直接返回,不會創建代理對象)
        Object wrap = Plugin.wrap(target, this);
        return wrap;
    }

    /**
     * 設置插件在配置文件中配置的參數值
     *
     * @param properties
     */
    @Override
    public void setProperties(Properties properties) {
        System.out.println(properties);
    }
}

2、在配置文件中寫入plugins標籤

 <plugins>
        <plugin interceptor="city.albert.TestInterceptor">
            <property name="name" value="name"/>
        </plugin>
    </plugins>

 

注:此文章爲個人彙總筆記,原文鏈接爲——https://www.cnblogs.com/niunafei/p/13096782.html

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章