欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

代理常見功能

日志代理

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

代理模式的組成

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

代理對象 = 增強代碼 + 目標對象(原對象)

代理模式分類

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

動態(tài)代理:代理類是運行時通過反射技術(shù)動態(tài)生成的。有點是一類相似功能的被代理類(即需要相同擴展功能的類)只需要一個動態(tài)代理類。

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

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

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

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

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

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

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

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

動態(tài)代理類

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

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

    /**
     * 執(zhí)行被代理對象的業(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大街收集電話號碼.....");
        //調(diào)用核心業(yè)務(wù)方法
        Object result = method.invoke(target,args);

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

        return result;
    }
}

代理工廠類

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

測試類

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

CGLIB 代理實現(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 {
    /**
     * 動態(tài)創(chuàng)建被代理類的代理對象
     * @param clazz 類型
     * @param <T>
     * @return 代理對象
     */
    public static <T> T create(Class<T> clazz){
        Enhancer enhancer = new Enhancer();
        // 采用接口內(nèi)部類的方式實現(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)建的動態(tài)代理類對象
        return (T) enhancer.create();
    }
}

測試類

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中的動態(tài)代理的文章就介紹到這了,更多相關(guān)Java動態(tài)代理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring Security 自定義資源服務(wù)器實踐過程

    Spring Security 自定義資源服務(wù)器實踐過程

    這篇文章主要介紹了Spring Security 自定義資源服務(wù)器實踐,我們通過自己搭建的授權(quán)服務(wù)器和資源服務(wù)器,完整體驗了OAuth2流程,需要的朋友可以參考下
    2022-08-08
  • Java中的異步與線程池解讀

    Java中的異步與線程池解讀

    這篇文章主要介紹了Java中的異步與線程池,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • Jenkins配置前端自動打包部署全過程(若依項目)

    Jenkins配置前端自動打包部署全過程(若依項目)

    Jenkins作為一個開源的自動化服務(wù)器,廣泛用于持續(xù)集成、持續(xù)部署(CI/CD)流程中,這篇文章主要給大家介紹了關(guān)于Jenkins配置前端自動打包部署(若依項目)的相關(guān)資料,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2024-09-09
  • 如何將復(fù)雜SQL轉(zhuǎn)換成Java對象的實例講解

    如何將復(fù)雜SQL轉(zhuǎn)換成Java對象的實例講解

    轉(zhuǎn)換復(fù)雜SQL到Java代碼,我們需要確定數(shù)據(jù)庫連接方式和工具,使用JDBC的API來連接數(shù)據(jù)庫、執(zhí)行SQL語句,復(fù)雜SQL語句可以被拆分為多個步驟,每個步驟執(zhí)行一個特定的操作,通過將SQL語句拆分為多個步驟,我們可以更好地理解復(fù)雜SQL的邏輯,并且更容易將其轉(zhuǎn)換為Java代碼
    2024-05-05
  • SpringCloud之消息總線Spring Cloud Bus實例代碼

    SpringCloud之消息總線Spring Cloud Bus實例代碼

    這篇文章主要介紹了SpringCloud之消息總線Spring Cloud Bus實例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • springboot整合JSR303校驗功能實現(xiàn)代碼

    springboot整合JSR303校驗功能實現(xiàn)代碼

    這篇文章主要介紹了springboot整合JSR303校驗功能實現(xiàn),JSR303校驗方法有統(tǒng)一校驗的需求,統(tǒng)一校驗實現(xiàn)以及分組校驗,本文結(jié)合實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2023-01-01
  • Dubbo3的Spring適配原理與初始化流程源碼解析

    Dubbo3的Spring適配原理與初始化流程源碼解析

    這篇文章主要為大家介紹了Dubbo3的Spring適配原理與初始化流程源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11
  • Java垃圾回收機制算法詳解

    Java垃圾回收機制算法詳解

    這篇文章主要介紹了Java垃圾回收機制算法詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • Mybatis-Plus同時使用邏輯刪除和唯一索引的問題及解決辦法(報數(shù)據(jù)重復(fù)Duplicate entry的問題)

    Mybatis-Plus同時使用邏輯刪除和唯一索引的問題及解決辦法(報數(shù)據(jù)重復(fù)Duplicate entry的

    在開發(fā)中,我們經(jīng)常會有邏輯刪除和唯一索引同時使用的情況,但當使用mybatis plus時,如果同時使用邏輯刪除和唯一索引,會報數(shù)據(jù)重復(fù)Duplicate entry的問題,如何解決這個問題呢,小編給大家分享Mybatis-Plus同時使用邏輯刪除和唯一索引的問題及解決辦法,一起看看吧
    2023-11-11
  • Java爬取網(wǎng)站源代碼和鏈接代碼實例

    Java爬取網(wǎng)站源代碼和鏈接代碼實例

    這篇文章主要介紹了Java爬取網(wǎng)站源代碼和鏈接代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-11-11

最新評論