Spring如何基于Proxy及cglib實現(xiàn)動態(tài)代理
spring中提供了兩種動態(tài)代理的方式,分別是Java Proxy以及cglib
JavaProxy只能代理接口,而cglib是通過繼承的方式,實現(xiàn)對類的代理
添加一個接口以及對應(yīng)的實現(xiàn)類
public interface HelloInterface {
void sayHello();
}
public class HelloInterfaceImpl implements HelloInterface {
@Override
public void sayHello() {
System.out.println("hello");
}
}
JavaProxy通過實現(xiàn)InvocationHandler實現(xiàn)代理
public class CustomInvocationHandler implements InvocationHandler {
private HelloInterface helloInterface;
public CustomInvocationHandler(HelloInterface helloInterface) {
this.helloInterface = helloInterface;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("before hello for proxy");
Object result = method.invoke(helloInterface, args);
System.out.println("after hello for proxy");
return result;
}
}
而cglib實現(xiàn)MethodInterceptor進(jìn)行方法上的代理
public class CustomMethodInterceptor implements MethodInterceptor {
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("before hello for cglib");
Object result = methodProxy.invokeSuper(o, objects);
System.out.println("after hello for cglib");
return result;
}
}
分別實現(xiàn)調(diào)用代碼
public static void main(String[] args) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(HelloInterfaceImpl.class);
enhancer.setCallback(new CustomMethodInterceptor());
HelloInterface target = (HelloInterface) enhancer.create();
target.sayHello();
CustomInvocationHandler invocationHandler = new CustomInvocationHandler(new HelloInterfaceImpl());
HelloInterface target2 = (HelloInterface) Proxy.newProxyInstance(Demo.class.getClassLoader(), new Class[]{HelloInterface.class}, invocationHandler);
target2.sayHello();
}
可以看到對于的代理信息輸出
before hello for cglib hello after hello for cglib before hello for proxy hello after hello for proxy
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot中的異常處理與參數(shù)校驗的方法實現(xiàn)
這篇文章主要介紹了SpringBoot中的異常處理與參數(shù)校驗的方法實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04
java中Iterator和ListIterator實例詳解
這篇文章主要介紹了java中Iterator和ListIterator實例詳解,具有一定借鑒價值,需要的朋友可以參考下。2017-12-12
如何解決getReader() has already been called&
這篇文章主要介紹了如何解決getReader() has already been called for this request問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-05-05
java數(shù)據(jù)結(jié)構(gòu)與算法數(shù)組模擬隊列示例詳解
這篇文章主要為大家介紹了java數(shù)據(jù)結(jié)構(gòu)與算法數(shù)組模擬隊列示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
Mybatis的@select和@SelectProvider注解方式動態(tài)SQL語句解讀
這篇文章主要介紹了Mybatis的@select和@SelectProvider注解方式動態(tài)SQL語句,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12

