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

Spring中的代理ProxyFactory解析

 更新時間:2023年12月25日 11:43:51   作者:努力中的少年  
這篇文章主要介紹了Spring中的ProxyFactory解析,在Java中,代理模式的實現(xiàn)通常依靠Proxy類和InvocationHandler接口,本文將介紹如何使用ProxyFactory來創(chuàng)建代理模式,需要的朋友可以參考下

前言

當(dāng)涉及到Java程序員們談?wù)撁嫦驅(qū)ο缶幊痰臅r候,代理模式總是一個熱門話題。代理模式在許多場景下都有用武之地,比如日志記錄、事務(wù)管理、權(quán)限驗證等等。

而在Java中,代理模式的實現(xiàn)通常依靠Proxy類和InvocationHandler接口。本文將介紹如何使用ProxyFactory來創(chuàng)建代理模式。

什么是代理模式?

在計算機科學(xué)中,代理模式是一種結(jié)構(gòu)型設(shè)計模式,它可以為其他對象提供一個替代品或者占位符,以控制對這個對象的訪問。

代理對象通常充當(dāng)了客戶端和目標(biāo)對象之間的中介,從而可以隱藏目標(biāo)對象的實現(xiàn)細(xì)節(jié)、保護目標(biāo)對象不被非法訪問、增強目標(biāo)對象的功能等等。

代理模式有兩種形式:靜態(tài)代理和動態(tài)代理。靜態(tài)代理的優(yōu)點是能夠提前做好一些工作,例如參數(shù)的檢查、日志記錄等等;

缺點則是需要針對每個需要代理的接口編寫一個代理類。而動態(tài)代理則可以根據(jù)接口生成代理對象,并且可以在運行時動態(tài)的添加和修改代理方法,因此更加靈活。

了解Proxy和InvocationHandler

在Java中,代理模式的實現(xiàn)主要依靠了Proxy類和InvocationHandler接口。其中,Proxy類是生成代理類的主要工具,而InvocationHandler則是提供對代理方法的具體實現(xiàn)。

Proxy類有兩個靜態(tài)方法可以用來創(chuàng)建代理對象:

public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)

該方法用于創(chuàng)建一個動態(tài)代理對象,參數(shù)loader表示ClassLoader、interfaces表示實現(xiàn)的接口列表、h表示InvocationHandler。

public static Object newProxyInstance(Class<?> clazz, InvocationHandler h)

該方法用于創(chuàng)建一個指定類的代理對象,參數(shù)clazz表示需要代理的類、h表示InvocationHandler。

而InvocationHandler接口則是定義了一個統(tǒng)一的代理方法:

public interface InvocationHandler {
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable;
}

在代理模式中,當(dāng)我們調(diào)用代理對象的方法時,實際上會調(diào)用InvocationHandler的invoke()方法,在這個方法中,我們可以根據(jù)需要進行一些操作,并返回目標(biāo)對象的執(zhí)行結(jié)果。

使用ProxyFactory創(chuàng)建動態(tài)代理

在Java中,如果要使用動態(tài)代理,首先需要創(chuàng)建一個InvocationHandler實現(xiàn)類。例如,下面是一個簡單的InvocationHandler實現(xiàn)類:

public class MyInvocationHandler implements InvocationHandler {
    private Object target;
    public MyInvocationHandler(Object target) {
        this.target = target;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("Before calling " + method.getName());
        Object result = method.invoke(target, args);
        System.out.println("After calling " + method.getName());
        return result;
    }
}

這個InvocationHandler實現(xiàn)類接受一個代理對象的目標(biāo)對象,然后在代理方法被調(diào)用前輸出一行日志,在返回結(jié)果之前再輸出一行日志。

然后我們可以通過ProxyFactory來創(chuàng)建一個動態(tài)代理對象。ProxyFactory是一個通用的代理工廠,它提供了很多便捷的方法來創(chuàng)建不同類型的代理。例如下面的代碼演示了如何使用ProxyFactory來創(chuàng)建一個JDK動態(tài)代理:

public class ProxyTest {
    public static void main(String[] args) {
        // 創(chuàng)建目標(biāo)對象
        HelloService helloService = new HelloServiceImpl();
        // 創(chuàng)建InvocationHandler實例
        InvocationHandler invocationHandler = new MyInvocationHandler(helloService);
        // 創(chuàng)建代理對象
        HelloService proxy = (HelloService) ProxyFactory.getProxy(helloService.getClass, invocationHandler);
    // 調(diào)用代理對象的方法
    proxy.sayHello("Jack");
}
}

在上面的代碼中,我們首先創(chuàng)建了一個目標(biāo)對象HelloServiceImpl。然后創(chuàng)建了一個InvocationHandler實例,并將HelloServiceImpl作為它的參數(shù)傳遞進去。最后通過調(diào)用ProxyFactory的getProxy()方法來生成一個動態(tài)代理對象proxy。在調(diào)用proxy的sayHello()方法時,實際上會調(diào)用MyInvocationHandler的invoke()方法,在這個方法中輸出日志并調(diào)用HelloServiceImpl的sayHello()方法,最終返回結(jié)果。

使用ProxyFactory創(chuàng)建Cglib動態(tài)代理

除了JDK動態(tài)代理之外,還有一種常見的動態(tài)代理實現(xiàn)方式是使用Cglib庫。與JDK動態(tài)代理不同,Cglib動態(tài)代理可以代理非接口類型的類。

下面我們演示如何使用ProxyFactory來創(chuàng)建一個Cglib動態(tài)代理:

public class ProxyTest {
    public static void main(String[] args) {
        // 創(chuàng)建目標(biāo)對象
        UserDaoImpl userDao = new UserDaoImpl();
        // 創(chuàng)建MethodInterceptor實例
        MethodInterceptor methodInterceptor = new MyMethodInterceptor(userDao);
        // 創(chuàng)建代理對象
        UserDaoImpl proxy = (UserDaoImpl) ProxyFactory.getProxy(userDao.getClass(), methodInterceptor);
        // 調(diào)用代理對象的方法
        proxy.save();
    }
}
class UserDaoImpl {
    public void save() {
        System.out.println("Saving user...");
    }
}
class MyMethodInterceptor implements MethodInterceptor {
    private Object target;
    public MyMethodInterceptor(Object target) {
        this.target = target;
    }
    @Override
    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
        System.out.println("Before calling " + method.getName());
        Object result = method.invoke(target, args);
        System.out.println("After calling " + method.getName());
        return result;
    }
}

在這個例子中,我們創(chuàng)建了一個UserDaoImpl類,并為它創(chuàng)建了一個MethodInterceptor實現(xiàn)類。

然后通過調(diào)用ProxyFactory的getProxy()方法來生成一個Cglib動態(tài)代理對象proxy。

在調(diào)用proxy的save()方法時,實際上會調(diào)用MyMethodInterceptor的intercept()方法,在這個方法中輸出日志并調(diào)用UserDaoImpl的save()方法,最終返回結(jié)果。

總結(jié)

本文介紹了如何使用ProxyFactory來創(chuàng)建動態(tài)代理,包括JDK動態(tài)代理和Cglib動態(tài)代理。

通過使用ProxyFactory,可以更加方便地創(chuàng)建代理對象,并且可以根據(jù)需要自定義不同類型的代理行為。

雖然動態(tài)代理不是解決所有問題的萬能工具,但在某些場景下,它仍然是一種非常強大和有用的設(shè)計模式。

到此這篇關(guān)于Spring中的代理ProxyFactory解析的文章就介紹到這了,更多相關(guān)Spring的ProxyFactory內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • mybatis的MappedStatement線程安全探究

    mybatis的MappedStatement線程安全探究

    這篇文章主要為大家介紹了mybatis的MappedStatement線程安全示例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08
  • 基于Java實現(xiàn)Redis多級緩存方案

    基于Java實現(xiàn)Redis多級緩存方案

    這篇文章主要介紹了Redis多級緩存方案分享,傳統(tǒng)緩存方案、多級緩存方案、JVM本地緩存,舉例說明這些方案,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-03-03
  • springboot /tmp 臨時目錄的具體實現(xiàn)

    springboot /tmp 臨時目錄的具體實現(xiàn)

    springboot應(yīng)用服務(wù)再啟動的時候,會在操作系統(tǒng)的/tmp目錄,本文主要介紹了springboot /tmp 臨時目錄的具體實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2024-06-06
  • 關(guān)于Spring?Validation數(shù)據(jù)校檢的使用流程分析

    關(guān)于Spring?Validation數(shù)據(jù)校檢的使用流程分析

    在實際項目中,對客戶端傳遞到服務(wù)端的參數(shù)進行校驗至關(guān)重要,SpringValidation提供了一種便捷的方式來實現(xiàn)這一需求,通過在POJO類的屬性上添加檢查注解,本文給大家介紹Spring?Validation數(shù)據(jù)校檢的使用流程,感興趣的朋友一起看看吧
    2024-11-11
  • 淺談Java關(guān)閉線程池shutdown和shutdownNow的區(qū)別

    淺談Java關(guān)閉線程池shutdown和shutdownNow的區(qū)別

    本文主要介紹了Java關(guān)閉線程池shutdown和shutdownNow的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Java實戰(zhàn)之多線程模擬站點售票

    Java實戰(zhàn)之多線程模擬站點售票

    今天帶大家來練習(xí)Java實戰(zhàn),文中多線程模擬站點售票這個問題作了詳細(xì)的介紹,對正在學(xué)習(xí)java的小伙伴們有很好地幫助,需要的朋友可以參考下
    2021-05-05
  • Java 時間日期詳細(xì)介紹及實例

    Java 時間日期詳細(xì)介紹及實例

    這篇文章主要介紹了Java 時間日期詳細(xì)介紹及實例的相關(guān)資料,需要的朋友可以參考下
    2017-01-01
  • Java實現(xiàn)滑動驗證碼的示例代碼

    Java實現(xiàn)滑動驗證碼的示例代碼

    這篇文章主要介紹了Java實現(xiàn)滑動驗證碼的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-01-01
  • SpringBoot中的@EnableAutoConfiguration注解解析

    SpringBoot中的@EnableAutoConfiguration注解解析

    這篇文章主要介紹了SpringBoot中的@EnableAutoConfiguration注解解析,@EnableAutoConfiguration也是借助@Import的幫助,將所有符合自動配置條件的bean定義注冊到IoC容器,需要的朋友可以參考下
    2023-09-09
  • Java實戰(zhàn)項目 圖書管理系統(tǒng)

    Java實戰(zhàn)項目 圖書管理系統(tǒng)

    這篇文章主要介紹了使用java SSM jsp mysql maven設(shè)計實現(xiàn)的精品圖書管理系統(tǒng),是一個很好的實例,對大家的學(xué)習(xí)和工作具有借鑒意義,建議收藏一下
    2021-09-09

最新評論

临沂市| 赣榆县| 张家口市| 平南县| 莱州市| 南和县| 繁昌县| 清苑县| 含山县| 锦州市| 潍坊市| 湘乡市| 茶陵县| 罗源县| 灯塔市| 依兰县| 周至县| 云龙县| 巴彦淖尔市| 隆子县| 潜江市| 巍山| 永修县| 南京市| 福建省| 千阳县| 黎川县| 河间市| 日照市| 贵定县| 北票市| 南阳市| 安仁县| 台湾省| 井陉县| 太仆寺旗| 筠连县| 会理县| 防城港市| 大渡口区| 屏边|