代理模式中的动态代理
生活随笔
收集整理的這篇文章主要介紹了
代理模式中的动态代理
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
動態代理和靜態對比基本思路是一致的,只不過動態代理功能更加強大,隨著業務的擴展適應性更強。如果還以找對象為例,使用動態代理相當于是能夠適應復雜的業務場景。不僅僅只是父親給兒子找對象,如果找對象這項業務發展成了一個產業,進而出現了媒婆、婚介所等這樣的形式。那么,此時用靜態代理成本就更大了,需要一個更加通用的解決方案,要滿足任何單身人士找對象的需求。我們升級一下代碼,先來看?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();}} }?
總結
以上是生活随笔為你收集整理的代理模式中的动态代理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 代理模式中的静态代理
- 下一篇: 高仿真 JDK Proxy手写实现