最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺析Java中的動(dòng)態(tài)代理

 更新時(shí)間:2022年09月23日 15:36:42   作者:科泰杰哥  
動(dòng)態(tài)代理指代理類和目標(biāo)類的關(guān)系在程序運(yùn)行的時(shí)候確定的,客戶通過代理類來調(diào)用目標(biāo)對(duì)象的方法。本文將通過案例詳細(xì)講解一下Java動(dòng)態(tài)代理的原理及實(shí)現(xiàn),需要的可以參考一下

代理常見功能

日志代理

數(shù)據(jù)庫(kù)訪問的事務(wù)代理

代理模式的組成

  • 抽象主題:通過接口或抽象類定義核心業(yè)務(wù)方法。
  • 真實(shí)主題:實(shí)現(xiàn)了接口的實(shí)現(xiàn)類,是實(shí)施代理的具體對(duì)象。即代理最終代理的是具體的實(shí)現(xiàn)類類而不是接口。
  • 代理:具有與代理對(duì)象相同的方法,可以控制和擴(kuò)展被代理對(duì)象的功能,也是使用代理對(duì)象的根據(jù)目的。

代理對(duì)象 = 增強(qiáng)代碼 + 目標(biāo)對(duì)象(原對(duì)象)

代理模式分類

靜態(tài)代理:代理類與被代理類一一對(duì)應(yīng),缺點(diǎn)是代理類太多。

動(dòng)態(tài)代理:代理類是運(yùn)行時(shí)通過反射技術(shù)動(dòng)態(tài)生成的。有點(diǎn)是一類相似功能的被代理類(即需要相同擴(kuò)展功能的類)只需要一個(gè)動(dòng)態(tài)代理類。

動(dòng)態(tài)代理實(shí)現(xiàn)的技術(shù)

JDK 代理:面向接口的代理,無法直接代理類,被代理的類必須實(shí)現(xiàn)某業(yè)務(wù)接口。

CGLIB 代理:功能更強(qiáng),性能更好,可以直接代理類而不用實(shí)現(xiàn)接口,是通過動(dòng)態(tài)創(chuàng)建被代理的子類重寫父類的被代理方法來實(shí)現(xiàn)統(tǒng)計(jì)附件功能的。不能代理final類或final方法。

JDK 代理的實(shí)現(xiàn)步驟

核心業(yè)務(wù)接口

public interface Buyer {
    /**
     * 賣房:核心業(yè)務(wù)方法
     * @return
     */
    String buy();
}

業(yè)務(wù)實(shí)現(xiàn)類

public class BuyerImpl implements Buyer{
    public String buy() {
        System.out.println("本人賣房,從不坑人...");
        return "一次搞定";
    }
}

動(dòng)態(tài)代理類

public class BuyerInvocationHandler implements InvocationHandler {
    //被代理對(duì)象
    private Object target;

    /**
     * 設(shè)置被代理對(duì)象
     * @param target
     */
    public void setTarget(Object target) {
        this.target = target;
    }

    /**
     * 執(zhí)行被代理對(duì)象的業(yè)務(wù)方法的代理方法
     * @param proxy
     * @param method
     * @param args
     * @return
     * @throws Throwable
     */
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("熬夜?jié)M大街收集電話號(hào)碼.....");
        //調(diào)用核心業(yè)務(wù)方法
        Object result = method.invoke(target,args);

        System.out.println("不滿意,再找我...");

        return result;
    }
}

代理工廠類

public class BuyerProxyFactory {
    /**
     * 工廠方法
     * @param target 需要被代理的對(duì)象
     * @param <T> 
     * @return 返回動(dòng)態(tài)生成的代理對(duì)象
     */
    public static <T> T create(Object target){
        // 創(chuàng)建動(dòng)態(tài)代理對(duì)象
        BuyerInvocationHandler handler = new BuyerInvocationHandler();
        // 設(shè)置被代理對(duì)象
        handler.setTarget(target);
        // 動(dòng)態(tài)創(chuàng)建執(zhí)行業(yè)務(wù)方法的代理對(duì)象
        return  (T) Proxy.newProxyInstance(
                target.getClass().getClassLoader(),
                target.getClass().getInterfaces(),
                handler);
    }
}

測(cè)試類

public class example {
    public static void main(String[] args) {
        //定義被代理對(duì)象
        //定義被代理對(duì)象
        Buyer buyer = new BuyerImpl();
        buyer.buy();  // 直接調(diào)用業(yè)務(wù)方法,沒有代理的功能
        // 使用代理工廠創(chuàng)建動(dòng)態(tài)代理類對(duì)象
        Buyer proxyBuyer = BuyerProxyFactory.create(buyer);
        proxyBuyer.buy();
    }
}

CGLIB 代理實(shí)現(xiàn)步驟

導(dǎo)入 POM

<dependency>
    <groupId>cglib</groupId>
    <artifactId>cglib-nodep</artifactId>
    <version>3.3.0</version>
</dependency>

定義業(yè)務(wù)方法

public class OrderService {
    public int insert(){
        System.out.println("添加訂單....");
        return 0;
    }
}

定義代理工廠類,與提供事務(wù)控制功能的MethodInterceptor合二為一

public class TransactionProxyFactory {
    /**
     * 動(dòng)態(tài)創(chuàng)建被代理類的代理對(duì)象
     * @param clazz 類型
     * @param <T>
     * @return 代理對(duì)象
     */
    public static <T> T create(Class<T> clazz){
        Enhancer enhancer = new Enhancer();
        // 采用接口內(nèi)部類的方式實(shí)現(xiàn)代理功能
        enhancer.setCallback(new MethodInterceptor() {
            public Object intercept(Object target, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
                System.out.println("開始事務(wù)。。。。");
                // 核心業(yè)務(wù),調(diào)用父類的方法
                Object result = methodProxy.invokeSuper(target,objects);
                System.out.println("提交或回滾事務(wù)....");
                return result;
            }
        });
        // 設(shè)置代理類的父類
        enhancer.setSuperclass(clazz);
        // 返回創(chuàng)建的動(dòng)態(tài)代理類對(duì)象
        return (T) enhancer.create();
    }
}

測(cè)試類

public class TransactionProxyFactoryTest {
    public static void main(String[] args) {
        // 使用代理創(chuàng)建業(yè)務(wù)邏輯類
        OrderService orderService =
                TransactionProxyFactory.create(OrderService.class);
        orderService.insert();

        CartService cartService = TransactionProxyFactory.create(CartService.class);
        cartService.insert();
    }
}

到此這篇關(guān)于淺析Java中的動(dòng)態(tài)代理的文章就介紹到這了,更多相關(guān)Java動(dòng)態(tài)代理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 淺談SpringMVC的執(zhí)行流程

    淺談SpringMVC的執(zhí)行流程

    下面小編就為大家?guī)硪黄獪\談SpringMVC的執(zhí)行流程。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-09-09
  • Java數(shù)據(jù)結(jié)構(gòu)之堆(優(yōu)先隊(duì)列)詳解

    Java數(shù)據(jù)結(jié)構(gòu)之堆(優(yōu)先隊(duì)列)詳解

    堆(優(yōu)先隊(duì)列)是一種典型的數(shù)據(jù)結(jié)構(gòu),其形狀是一棵完全二叉樹,一般用于求解topk問題。本文將利用Java語言實(shí)現(xiàn)堆,感興趣的可以學(xué)習(xí)一下
    2022-07-07
  • java實(shí)現(xiàn)用戶自動(dòng)登錄

    java實(shí)現(xiàn)用戶自動(dòng)登錄

    這篇文章主要為大家詳細(xì)介紹了java用戶自動(dòng)登錄的實(shí)現(xiàn)方法,分為六個(gè)步驟實(shí)現(xiàn)用戶自動(dòng)登錄,并驗(yàn)證用戶是否已經(jīng)登錄,感興趣的小伙伴們可以參考一下
    2016-03-03
  • SpringBoot集成SpringMVC的方法示例

    SpringBoot集成SpringMVC的方法示例

    這篇文章主要介紹了SpringBoot集成SpringMVC的方法示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • netty服務(wù)端輔助類ServerBootstrap創(chuàng)建邏輯分析

    netty服務(wù)端輔助類ServerBootstrap創(chuàng)建邏輯分析

    這篇文章主要介紹了netty服務(wù)端輔助類ServerBootstrap創(chuàng)建邏輯分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-03-03
  • 關(guān)于Spring Boot動(dòng)態(tài)權(quán)限變更問題的實(shí)現(xiàn)方案

    關(guān)于Spring Boot動(dòng)態(tài)權(quán)限變更問題的實(shí)現(xiàn)方案

    這篇文章主要介紹了Spring Boot動(dòng)態(tài)權(quán)限變更實(shí)現(xiàn)的整體方案使用session作為緩存,結(jié)合AOP技術(shù)進(jìn)行token認(rèn)證和權(quán)限控制,本文給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2021-06-06
  • Spring使用RestTemplate模擬form提交示例

    Spring使用RestTemplate模擬form提交示例

    本篇文章主要介紹了Spring使用RestTemplate模擬form提交示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-03-03
  • 智能手表開發(fā)API接口

    智能手表開發(fā)API接口

    這篇文章主要介紹了智能手表開發(fā)API接口,使用圖靈機(jī)器人平臺(tái)接口實(shí)現(xiàn)天氣預(yù)報(bào),非常簡(jiǎn)單實(shí)用,這里推薦給大家。
    2015-03-03
  • JSON 與對(duì)象、集合之間的轉(zhuǎn)換的示例

    JSON 與對(duì)象、集合之間的轉(zhuǎn)換的示例

    在開發(fā)過程中,經(jīng)常需要和別的系統(tǒng)交換數(shù)據(jù),數(shù)據(jù)交換的格式有XML、JSON等,JSON作為一個(gè)輕量級(jí)的數(shù)據(jù)格式比xml效率要高,本篇文章主要介紹了JSON 與 對(duì)象 、集合 之間的轉(zhuǎn)換,有興趣的可以了解一下。
    2017-01-01
  • java秒殺之redis限流操作詳解

    java秒殺之redis限流操作詳解

    這篇文章主要為大家詳細(xì)介紹了java秒殺之redis限流操作,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11

最新評(píng)論

渭南市| 高陵县| 永修县| 武夷山市| 盖州市| 虹口区| 井陉县| 宁化县| 隆回县| 鄂温| 大厂| 澎湖县| 阿图什市| 龙泉市| 上杭县| 清新县| 易门县| 五指山市| 恭城| 景宁| 时尚| 上思县| 新津县| 安图县| 斗六市| 越西县| 汝阳县| 明星| 罗山县| 灵丘县| 安宁市| 商河县| 武义县| 腾冲县| 河津市| 潮州市| 柯坪县| 深州市| 虞城县| 通渭县| 漳浦县|