插件原理:在四大對象創建的時候
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