成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

使用動(dòng)態(tài)代理簡(jiǎn)單模擬一下spring的事務(wù)管理

shaonbean / 1685人閱讀

摘要:我們平時(shí)用到的的事務(wù)管理的都是的實(shí)例把事務(wù)操作放到了代理類中統(tǒng)一或本身就是一個(gè)代理類,在調(diào)用指定方法前后添加一系列操作

按照平時(shí)寫代碼的習(xí)慣,我們會(huì)定義一個(gè)service接口

package com.proxy.test;
public interface UserService {
    public void sayHello(String word);
}

接著是實(shí)現(xiàn)類

package com.proxy.test;
public class UserServiceImpl implements UserService{
    @Override
    public void sayHello(String word) {
        System.out.println("執(zhí)行dao的刪除操作,添加一個(gè)用戶:" + word);
        System.out.println("執(zhí)行dao的刪除添加,刪除一個(gè)用戶:" + word);
    }
}

我們的目的是,執(zhí)行sayHello中的添加刪除操作時(shí),讓這幾條sql語(yǔ)句同時(shí)提交(commit)或同時(shí)回滾(rollback),下面我們用動(dòng)態(tài)代理的方式,實(shí)現(xiàn)這個(gè)功能:
自定義一個(gè)代理管家,幫我們創(chuàng)建代理類,需要實(shí)現(xiàn)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 會(huì)返回一個(gè)代理對(duì)象
         * target.getClass() --> 被代理對(duì)象的ClassLoader,這里實(shí)際對(duì)應(yīng)UserServiceImpl類
         * target.getClass().getInterfaces() --> 被代理對(duì)象實(shí)現(xiàn)的接口列表(UserService),指定之后,代理對(duì)象就可以使用其接口中的方法了
         * this -- 表示的是當(dāng)這個(gè)動(dòng)態(tài)代理對(duì)象在調(diào)用方法的時(shí)候,會(huì)通過哪個(gè)InvocationHandler,這里實(shí)際是MyProxyManager這個(gè)類
         */
        return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
    }

    /**
     * 我們通過MyProxyManager創(chuàng)建出來的代理對(duì)象在調(diào)用自己的方法時(shí),
     * 會(huì)通過invoke這個(gè)方法進(jìn)行調(diào)用,而不是直接調(diào)用
     * @param proxy 被代理對(duì)象
     * @param method 被代理對(duì)象執(zhí)行的方法
     * @param args 被代理對(duì)象執(zhí)行的方法所需要的參數(shù)
     *
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) {
        System.out.println("我是動(dòng)態(tài)代理對(duì)象");
        System.out.println("準(zhǔn)備進(jìn)入事務(wù)..");
        Object result = null;
        try{
            // 執(zhí)行被代理對(duì)象自己的方法
            result = method.invoke(target, args);
        }catch(Exception e){
            // 如果有錯(cuò)誤,執(zhí)行數(shù)據(jù)庫(kù)的rollBack方法
            System.out.println("執(zhí)行rollBack");
        }
        // 如果沒錯(cuò),執(zhí)行數(shù)據(jù)庫(kù)的commit方法
        System.out.println("執(zhí)行commit");
        System.out.println("-----------------------");
        return result;
    }
}

測(cè)試代碼

public static void main(String[] args) {
    MyProxyManager manager = new MyProxyManager();
    // 創(chuàng)建UserService的代理對(duì)象
    UserService userService = (UserService) manager.bind(new UserServiceImpl());
    userService.sayHello("lalala");
}

運(yùn)行看一下效果:

我是動(dòng)態(tài)代理對(duì)象
準(zhǔn)備進(jìn)入事務(wù)..
執(zhí)行dao的刪除操作,添加一個(gè)用戶:lalala
執(zhí)行dao的刪除添加,刪除一個(gè)用戶:lalala
執(zhí)行commit

這里只是使用打印語(yǔ)句簡(jiǎn)單模擬了數(shù)據(jù)庫(kù)的操作,沒有真正連接數(shù)據(jù)庫(kù)操作,有空的童鞋可以實(shí)際操作一下。

我們平時(shí)用到的spring的事務(wù)管理、springmvc的interceptor都是aop的實(shí)例
spring把事務(wù)操作放到了代理類中統(tǒng)一commit或rollback
interceptor本身就是一個(gè)代理類,在調(diào)用指定方法前后添加一系列操作

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/76463.html

相關(guān)文章

  • Spring AOP實(shí)現(xiàn)原理

    摘要:使用與的靜態(tài)代理不同,使用的動(dòng)態(tài)代理,所謂的動(dòng)態(tài)代理就是說框架不會(huì)去修改字節(jié)碼,而是在內(nèi)存中臨時(shí)為方法生成一個(gè)對(duì)象,這個(gè)對(duì)象包含了目標(biāo)對(duì)象的全部方法,并且在特定的切點(diǎn)做了增強(qiáng)處理,并回調(diào)原對(duì)象的方法。 AOP(Aspect Orient Programming),我們一般稱為面向方面(切面)編程,作為面向?qū)ο蟮囊环N補(bǔ)充,用于處理系統(tǒng)中分布于各個(gè)模塊的橫切關(guān)注點(diǎn),比如事務(wù)管理、日志、緩存...

    ephererid 評(píng)論0 收藏0
  • Java反射-動(dòng)態(tài)代理

    摘要:動(dòng)態(tài)代理有多種不同的用途,例如,數(shù)據(jù)庫(kù)連接和事務(wù)管理用于單元測(cè)試的動(dòng)態(tài)模擬對(duì)象其他類似的方法攔截。調(diào)用序列和下面的流程類似單元測(cè)試動(dòng)態(tài)對(duì)象模擬利用動(dòng)態(tài)代理實(shí)現(xiàn)單元測(cè)試的動(dòng)態(tài)存根代理和代理??蚣馨寻b成動(dòng)態(tài)代理。 使用反射可以在運(yùn)行時(shí)動(dòng)態(tài)實(shí)現(xiàn)接口。這可以使用類java.lang.reflect.Proxy。這個(gè)類的名稱是我將這些動(dòng)態(tài)接口實(shí)現(xiàn)稱之為動(dòng)態(tài)代理的原因。動(dòng)態(tài)代理有多種不同的用途,...

    Acceml 評(píng)論0 收藏0
  • 設(shè)計(jì)模式之代理模式

    摘要:下面我們通過玩英雄聯(lián)盟代練的例子來說明下登錄游戲贏下了一局英雄聯(lián)盟,獲得了金幣測(cè)試結(jié)果登錄游戲贏下了一局英雄聯(lián)盟,獲得了金幣可以這樣理解,自己寫代理類的方式就是靜態(tài)代理。 前言 剛上大學(xué)那會(huì),英雄聯(lián)盟火的一塌糊涂,當(dāng)時(shí)每天都想著升到30級(jí)開啟排位之旅??墒巧?0級(jí)需要大把的時(shí)間不說,這時(shí)候匹配到的人,水平過于參差不齊,問候你全家的事經(jīng)常發(fā)生,那個(gè)時(shí)候就想要是能有個(gè)代練幫我升到30級(jí)該...

    xuweijian 評(píng)論0 收藏0
  • Java面試 32個(gè)核心必考點(diǎn)完全解析

    摘要:如問到是否使用某框架,實(shí)際是是問該框架的使用場(chǎng)景,有什么特點(diǎn),和同類可框架對(duì)比一系列的問題。這兩個(gè)方向的區(qū)分點(diǎn)在于工作方向的側(cè)重點(diǎn)不同。 [TOC] 這是一份來自嗶哩嗶哩的Java面試Java面試 32個(gè)核心必考點(diǎn)完全解析(完) 課程預(yù)習(xí) 1.1 課程內(nèi)容分為三個(gè)模塊 基礎(chǔ)模塊: 技術(shù)崗位與面試 計(jì)算機(jī)基礎(chǔ) JVM原理 多線程 設(shè)計(jì)模式 數(shù)據(jù)結(jié)構(gòu)與算法 應(yīng)用模塊: 常用工具集 ...

    JiaXinYi 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<