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. 阿里前端開(kāi)發(fā)中的規(guī)范要求2. 低版本IE正常運(yùn)行HTML5+CSS3網(wǎng)站的3種解決方案3. css進(jìn)階學(xué)習(xí) 選擇符4. UDDI FAQs5. XML入門的常見(jiàn)問(wèn)題(一)6. html小技巧之td,div標(biāo)簽里內(nèi)容不換行7. PHP字符串前后字符或空格刪除方法介紹8. XML入門精解之結(jié)構(gòu)與語(yǔ)法9. Echarts通過(guò)dataset數(shù)據(jù)集實(shí)現(xiàn)創(chuàng)建單軸散點(diǎn)圖10. 概述IE和SQL2k開(kāi)發(fā)一個(gè)XML聊天程序
