Spring如何基于Proxy及cglib實(shí)現(xiàn)動(dòng)態(tài)代理
spring中提供了兩種動(dòng)態(tài)代理的方式,分別是Java Proxy以及cglib
JavaProxy只能代理接口,而cglib是通過繼承的方式,實(shí)現(xiàn)對(duì)類的代理
添加一個(gè)接口以及對(duì)應(yīng)的實(shí)現(xiàn)類
public interface HelloInterface { void sayHello(); }
public class HelloInterfaceImpl implements HelloInterface { @Override public void sayHello() { System.out.println("hello"); } }
JavaProxy通過實(shí)現(xiàn)InvocationHandler實(shí)現(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實(shí)現(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; } }
分別實(shí)現(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(); }
可以看到對(duì)于的代理信息輸出
before hello for cglib hello after hello for cglib before hello for proxy hello after hello for proxy
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
SpringMVC請(qǐng)求、響應(yīng)和攔截器的使用實(shí)例詳解
攔截器(Interceptor) 它是一個(gè)Spring組件,并由Spring容器管理,并不依賴Tomcat等容器,是可以單獨(dú)使用的,這篇文章給大家介紹SpringMVC請(qǐng)求、響應(yīng)和攔截器的使用,感興趣的朋友一起看看吧2024-03-03詳解spring cloud ouath2中的資源服務(wù)器
這篇文章主要介紹了spring cloud ouath2中的資源服務(wù)器的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02java實(shí)現(xiàn)簡(jiǎn)單圖片上傳下載功能
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡(jiǎn)單圖片上傳下載功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-10-10怎么把本地jar包放入本地maven倉(cāng)庫(kù)和遠(yuǎn)程私服倉(cāng)庫(kù)
這篇文章主要介紹了怎么把本地jar包放入本地maven倉(cāng)庫(kù)和遠(yuǎn)程私服倉(cāng)庫(kù)的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06java this 用法詳解及簡(jiǎn)單實(shí)例
這篇文章主要介紹了java this 用法詳解及簡(jiǎn)單實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-03-03深入學(xué)習(xí)java并發(fā)包ConcurrentHashMap源碼
這篇文章主要介紹了深入學(xué)習(xí)java并發(fā)包ConcurrentHashMap源碼,整個(gè) ConcurrentHashMap 由一個(gè)個(gè) Segment 組成,Segment 代表”部分“或”一段“的意思,所以很多地方都會(huì)將其描述為分段鎖。,需要的朋友可以參考下2019-06-06Java中的動(dòng)態(tài)代理原理及實(shí)現(xiàn)
這篇文章主要介紹了Java中的動(dòng)態(tài)代理原理及實(shí)現(xiàn),動(dòng)態(tài)是相對(duì)于靜態(tài)而言,何為靜態(tài),即編碼時(shí)手動(dòng)編寫代理類、委托類,而動(dòng)態(tài)呢,是不編寫具體實(shí)現(xiàn)類,等到使用時(shí),動(dòng)態(tài)創(chuàng)建一個(gè)來實(shí)現(xiàn)代理的目的,需要的朋友可以參考下2023-12-12spring整合redis緩存并以注解(@Cacheable、@CachePut、@CacheEvict)形式使用
本篇文章主要介紹了spring整合redis緩存并以注解(@Cacheable、@CachePut、@CacheEvict)形式使用,具有一定的參考價(jià)值,有興趣的可以了解一下。2017-04-04