Mybatis中攔截器的簡單實現(xiàn)方法
前言
需求驅(qū)動學(xué)習(xí),最近一周組長讓我在業(yè)務(wù)模塊里加日志,經(jīng)過與導(dǎo)師以及組長討論決定用攔截器記錄日志。周五下班前已經(jīng)發(fā)了提測郵件。
雖然我知道 MyBatis 有這東西,但是沒在實際情況中用過,心里有點虛2333……所以才有了此文的理解。
前世今生
它的本質(zhì)就是 JDK 的動態(tài)代理。首先先來復(fù)習(xí)一下動態(tài)代理我貼了一段最常見的 JDK 動態(tài)代理的代碼
//服務(wù)員的接口
public interface Waiter {
void serve();
}
//服務(wù)員的實現(xiàn)
public class WaiterImpl implements Waiter {
@Override
public void serve() {
System.out.println("服務(wù)中...");
}
}
//需要代理的對象處理器
class WaitInvocationHandler implements InvocationHandler {
private Waiter waiter;
public WaitInvocationHandler(Waiter waiter1) {
waiter = waiter1;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("你好");
Object invoke = method.invoke(waiter, args);
System.out.println("再見");
return invoke;
}
}
public class App {
//普通的實現(xiàn)
@Test
public void fun() {
Waiter waiter = new WaiterImpl();
waiter.serve();
}
@Test
public void fun1() {
Waiter a = new WaiterImpl();
ClassLoader classLoader = getClass().getClassLoader();
Class[] classes = {Waiter.class};
//生成代理對象
Waiter waiterproxy = (Waiter) Proxy.newProxyInstance(classLoader, classes, new WaitInvocationHandler(a));
waiterproxy.serve();
}
}
攔截器
V1
我現(xiàn)在要在函數(shù)執(zhí)行前后記錄日志操作,考慮需要在代理方法那里定義個攔截器的接口,如下代碼所示
//攔截器 V1 版本
public interface MyInterceptorV1 {
void interceptor();
}
//代理對象變成這個
public class TargetProxyV1 implements InvocationHandler {
private Target target;
private MyInterceptorV1 myInterceptor;
public TargetProxyV1(Target target, MyInterceptorV1 myInterceptor) {
this.target = target;
this.myInterceptor = myInterceptor;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
myInterceptor.interceptor();
return method.invoke(target, args);
}
}
這是最簡單的版本,但是我們很多時候需要攔截參數(shù)等根據(jù)參數(shù)判斷攔不攔截等,代碼更新如下
public interface MyInterceptorV1 {
void interceptor(Method method, Object[] args);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
myInterceptor.interceptor(method, args);
return method.invoke(target, args);
}
V2
似乎上面的方案很完美
廢話肯定不完美,不然怎么會有這段
沒錯,第二段代碼并不是很優(yōu)雅,有方法參數(shù)重復(fù),可以考慮將三者抽出來,直接在攔截器的實現(xiàn)里寫上 method.invoke(target, args); ,如下代碼所示
@Getter
@Setter
@AllArgsConstructor
public class MyInvocation {
private Object target;
private Method method;
private Object[] args;
public Object proceed() throws InvocationTargetException, IllegalAccessException {
return method.invoke(target, args);
}
}
//沒錯這就是 V2 版本
public interface MyInterceptorV2 {
Object interceptor(MyInvocation invocation) throws Throwable;
}
總結(jié)
Mybatis 的攔截器就是像我上面這么寫的,
名字也跟我取得一樣, 只是它更加復(fù)雜,能夠通過注解區(qū)分攔截 update 操作和 query
等操作。
既完成了任務(wù)又鞏固了原來的知識,這種感覺很棒,最關(guān)鍵的是還有錢拿……
好了,以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。
- mybatisplus 的SQL攔截器實現(xiàn)關(guān)聯(lián)查詢功能
- Mybatis自定義攔截器和插件開發(fā)詳解
- mybatis 自定義實現(xiàn)攔截器插件Interceptor示例
- mybatis 通過攔截器打印完整的sql語句以及執(zhí)行結(jié)果操作
- Mybatis Plugin攔截器開發(fā)過程詳解
- 簡單了解mybatis攔截器實現(xiàn)原理及實例
- mybatis攔截器實現(xiàn)通用權(quán)限字段添加的方法
- mybatis攔截器與分頁插件實例教程
- Mybatis Interceptor 攔截器的實現(xiàn)
- MyBatis攔截器實現(xiàn)分頁功能的實現(xiàn)方法
- MyBatis攔截器的原理與使用
相關(guān)文章
如何使用IntelliJ IDEA中的Live Templates自定義代碼模板
在IntelliJ IDEA中,通過使用LiveTemplates功能,可以實現(xiàn)快速編碼和自定義代碼模板,例如,輸入“main”可以自動補全主函數(shù)結(jié)構(gòu),“sout”可以補全輸出語句,用戶可以通過設(shè)置中的LiveTemplates選項查看和定義快捷模板,支持使用分組管理和參數(shù)化模板內(nèi)容,適應(yīng)復(fù)雜的編碼需求2024-11-11
java?9大性能優(yōu)化經(jīng)驗總結(jié)
這篇文章主要介紹了java?9大性能優(yōu)化經(jīng)驗總結(jié),包括:Java代碼優(yōu)化,數(shù)據(jù)庫優(yōu)化,分布式緩存,異步化,Web前段,搜索引擎優(yōu)化等需要的朋友可以參考下2023-02-02
Java使用Scala實現(xiàn)尾遞歸優(yōu)化來解決爆棧問題
Scala?作為一種多范式的編程語言,結(jié)合了面向?qū)ο蠛秃瘮?shù)式編程的特性,在?Scala?中,尾遞歸?是通過編譯器優(yōu)化來防止棧溢出問題的,尾遞歸優(yōu)化是一種特殊的優(yōu)化方式,可以讓遞歸調(diào)用不使用新的棧幀,所以本文介紹了在Java項目中如何使用Scala實現(xiàn)尾遞歸優(yōu)化來解決爆棧問題2024-10-10
RestClient?通過攔截器實現(xiàn)請求加密的示例
本文介紹了如何通過攔截器實現(xiàn)請求加密,并通過RestClient優(yōu)化了加密過程,傳統(tǒng)的加密方法依賴對象轉(zhuǎn)換和序列化處理,容易導(dǎo)致加密不一致或難以調(diào)試的問題,通過引入攔截器,可以直接操作請求體,避免了不必要的轉(zhuǎn)換步驟,確保加密過程與請求體完全一致,感興趣的朋友一起看看吧2025-02-02
SpringBoot使用ShardingSphere-Proxy的實現(xiàn)示例
ShardingSphere-Proxy是一個獨立的數(shù)據(jù)庫代理層,可以與SpringBoot集成,本文介紹了SpringBoot使用ShardingSphere-Proxy的實現(xiàn)示例,具有一定的參考價值,感興趣的可以了解一下2025-02-02

