您好,登錄后才能下訂單哦!
這篇文章運用簡單易懂的例子給大家介紹Spring使用Proxy和cglib實現動態代理的方法,代碼非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
spring中提供了兩種動態代理的方式,分別是Proxy以及cglib,代理(Proxy)是一種設計模式,提供了對目標對象另外的訪問方式;即通過代理對象訪問目標對象.這樣做的好處是:可以在目標對象實現的基礎上,增強額外的功能操作,即擴展目標對象的功能;而cglib動態代理是利用asm開源包,對代理對象類的class文件加載進來,通過修改其字節碼生成子類來處理。
添加一個接口以及對應的實現類
public interface HelloInterface { void sayHello(); }
public class HelloInterfaceImpl implements HelloInterface { @Override public void sayHello() { System.out.println("hello"); } }
JavaProxy通過實現InvocationHandler實現代理
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實現MethodInterceptor進行方法上的代理
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; } }
分別實現調用代碼
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
關于Spring使用Proxy和cglib實現動態代理的方法就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。