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進行方法上的代理
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 cglibhelloafter hello for cglibbefore hello for proxyhelloafter hello for proxy
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
1. SpringBoot使用Captcha生成驗證碼2. android studio實現(xiàn)簡單的計算器(無bug)3. JavaEE SpringMyBatis是什么? 它和Hibernate的區(qū)別及如何配置MyBatis4. Python 忽略文件名編碼的方法5. android 控件同時監(jiān)聽單擊和雙擊實例6. Java Media Framework 基礎(chǔ)教程7. springboot項目整合druid數(shù)據(jù)庫連接池的實現(xiàn)8. 解決vue頁面刷新,數(shù)據(jù)丟失的問題9. python 讀txt文件,按‘,’分割每行數(shù)據(jù)操作10. python logging.info在終端沒輸出的解決
