Spring如何基于Proxy及cglib實(shí)現(xiàn)動(dòng)態(tài)代理
spring中提供了兩種動(dòng)態(tài)代理的方式,分別是Java Proxy以及cglib
JavaProxy只能代理接口,而cglib是通過(guò)繼承的方式,實(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通過(guò)實(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 cglibhelloafter hello for cglibbefore hello for proxyhelloafter hello for proxy
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
1. JS實(shí)現(xiàn)前端動(dòng)態(tài)分頁(yè)碼代碼實(shí)例2. 關(guān)于IDEA 2020.3 多窗口視圖丟失的問(wèn)題3. javascript實(shí)現(xiàn)貪吃蛇小練習(xí)4. js實(shí)現(xiàn)碰撞檢測(cè)5. 一文帶你徹底理解Java序列化和反序列化6. 用Spring JMS使異步消息變得簡(jiǎn)單7. PHP驗(yàn)證碼工具-Securimage8. Python 制作查詢商品歷史價(jià)格的小工具9. Python 利用Entrez庫(kù)篩選下載PubMed文獻(xiàn)摘要的示例10. ASP.NET MVC使用jQuery ui的progressbar實(shí)現(xiàn)進(jìn)度條

網(wǎng)公網(wǎng)安備