日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

代理模式中的动态代理

發布時間:2024/4/13 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 代理模式中的动态代理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

動態代理和靜態對比基本思路是一致的,只不過動態代理功能更加強大,隨著業務的擴展適應性更強。如果還以找對象為例,使用動態代理相當于是能夠適應復雜的業務場景。不僅僅只是父親給兒子找對象,如果找對象這項業務發展成了一個產業,進而出現了媒婆、婚介所等這樣的形式。那么,此時用靜態代理成本就更大了,需要一個更加通用的解決方案,要滿足任何單身人士找對象的需求。我們升級一下代碼,先來看?JDK實現方式:

JDK實現方式

創建媒婆(婚介)JDKMeipo類:?

public class JDKMeipo implements InvocationHandler {private Object target;public Object getInstance(Object target) throws Exception{this.target = target;Class<?> clazz = target.getClass();return Proxy.newProxyInstance(clazz.getClassLoader(),clazz.getInterfaces(),this);}public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {before();Object obj = method.invoke(this.target,args);after();return obj;}private void before(){System.out.println("我是媒婆,我要給你找對象,現在已經確認你的需求");System.out.println("開始物色");}private void after(){System.out.println("OK的話,準備辦事");} }

創建單身客戶 Customer類:?

public class Customer {public void findLove(){System.out.println("兒子要求:膚白貌美大長腿");} }

上面的案例理解了話,我們再來看數據源動態路由業務,幫助小伙伴們對動態代理加深一下印象。創建動態代理的類 OrderServiceDynamicProxy,代碼如下:?

public class OrderServiceDynamicProxy implements GPInvocationHandler {private SimpleDateFormat yearFormat = new SimpleDateFormat("yyyy");Object proxyObj;public Object getInstance(Object proxyObj) {this.proxyObj = proxyObj;Class<?> clazz = proxyObj.getClass();return GPProxy.newProxyInstance(new GPClassLoader(),clazz.getInterfaces(),this);}public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {before(args[0]);Object object = method.invoke(proxyObj,args);after();return object;}private void after() {System.out.println("Proxy after method");//還原成默認的數據源DynamicDataSourceEntity.restore();}//target 應該是訂單對象Orderprivate void before(Object target) {try {//進行數據源的切換System.out.println("Proxy before method");//約定優于配置Long time = (Long) target.getClass().getMethod("getCreateTime").invoke(target);Integer dbRouter = Integer.valueOf(yearFormat.format(new Date(time)));System.out.println("靜態代理類自動分配到【DB_" + dbRouter + "】數據源處理數據");DynamicDataSourceEntity.set(dbRouter);}catch (Exception e){e.printStackTrace();}} }

?

總結

以上是生活随笔為你收集整理的代理模式中的动态代理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。