摘要:我們平時用到的的事務管理的都是的實例把事務操作放到了代理類中統一或本身就是一個代理類,在調用指定方法前后添加一系列操作
按照平時寫代碼的習慣,我們會定義一個service接口
package com.proxy.test; public interface UserService { public void sayHello(String word); }
接著是實現類
package com.proxy.test; public class UserServiceImpl implements UserService{ @Override public void sayHello(String word) { System.out.println("執行dao的刪除操作,添加一個用戶:" + word); System.out.println("執行dao的刪除添加,刪除一個用戶:" + word); } }
我們的目的是,執行sayHello中的添加刪除操作時,讓這幾條sql語句同時提交(commit)或同時回滾(rollback),下面我們用動態代理的方式,實現這個功能:
自定義一個代理管家,幫我們創建代理類,需要實現InvocationHandler接口(必須)
package com.proxy.test; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class MyProxyManager implements InvocationHandler { private Object target; public Object bind(Object target){ this.target = target; /* * Proxy.newProxyInstance 會返回一個代理對象 * target.getClass() --> 被代理對象的ClassLoader,這里實際對應UserServiceImpl類 * target.getClass().getInterfaces() --> 被代理對象實現的接口列表(UserService),指定之后,代理對象就可以使用其接口中的方法了 * this -- 表示的是當這個動態代理對象在調用方法的時候,會通過哪個InvocationHandler,這里實際是MyProxyManager這個類 */ return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this); } /** * 我們通過MyProxyManager創建出來的代理對象在調用自己的方法時, * 會通過invoke這個方法進行調用,而不是直接調用 * @param proxy 被代理對象 * @param method 被代理對象執行的方法 * @param args 被代理對象執行的方法所需要的參數 * */ @Override public Object invoke(Object proxy, Method method, Object[] args) { System.out.println("我是動態代理對象"); System.out.println("準備進入事務.."); Object result = null; try{ // 執行被代理對象自己的方法 result = method.invoke(target, args); }catch(Exception e){ // 如果有錯誤,執行數據庫的rollBack方法 System.out.println("執行rollBack"); } // 如果沒錯,執行數據庫的commit方法 System.out.println("執行commit"); System.out.println("-----------------------"); return result; } }
測試代碼
public static void main(String[] args) { MyProxyManager manager = new MyProxyManager(); // 創建UserService的代理對象 UserService userService = (UserService) manager.bind(new UserServiceImpl()); userService.sayHello("lalala"); }
運行看一下效果:
我是動態代理對象 準備進入事務.. 執行dao的刪除操作,添加一個用戶:lalala 執行dao的刪除添加,刪除一個用戶:lalala 執行commit
這里只是使用打印語句簡單模擬了數據庫的操作,沒有真正連接數據庫操作,有空的童鞋可以實際操作一下。
我們平時用到的spring的事務管理、springmvc的interceptor都是aop的實例
spring把事務操作放到了代理類中統一commit或rollback
interceptor本身就是一個代理類,在調用指定方法前后添加一系列操作
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/76463.html
摘要:使用與的靜態代理不同,使用的動態代理,所謂的動態代理就是說框架不會去修改字節碼,而是在內存中臨時為方法生成一個對象,這個對象包含了目標對象的全部方法,并且在特定的切點做了增強處理,并回調原對象的方法。 AOP(Aspect Orient Programming),我們一般稱為面向方面(切面)編程,作為面向對象的一種補充,用于處理系統中分布于各個模塊的橫切關注點,比如事務管理、日志、緩存...
摘要:動態代理有多種不同的用途,例如,數據庫連接和事務管理用于單元測試的動態模擬對象其他類似的方法攔截。調用序列和下面的流程類似單元測試動態對象模擬利用動態代理實現單元測試的動態存根代理和代理。框架把包裝成動態代理。 使用反射可以在運行時動態實現接口。這可以使用類java.lang.reflect.Proxy。這個類的名稱是我將這些動態接口實現稱之為動態代理的原因。動態代理有多種不同的用途,...
摘要:如問到是否使用某框架,實際是是問該框架的使用場景,有什么特點,和同類可框架對比一系列的問題。這兩個方向的區分點在于工作方向的側重點不同。 [TOC] 這是一份來自嗶哩嗶哩的Java面試Java面試 32個核心必考點完全解析(完) 課程預習 1.1 課程內容分為三個模塊 基礎模塊: 技術崗位與面試 計算機基礎 JVM原理 多線程 設計模式 數據結構與算法 應用模塊: 常用工具集 ...
閱讀 6199·2021-11-22 15:32
閱讀 823·2021-11-11 16:54
閱讀 3162·2021-10-13 09:40
閱讀 2168·2021-09-03 10:35
閱讀 1833·2021-08-09 13:47
閱讀 1875·2019-08-30 15:55
閱讀 1938·2019-08-30 15:43
閱讀 2460·2019-08-29 17:06