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

Spring中的代理ProxyFactory解析

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

前言

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

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

什么是代理模式?

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

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

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

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

了解Proxy和InvocationHandler

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

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

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

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

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

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

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

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

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

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

在Java中,如果要使用動(dòng)態(tài)代理,首先需要?jiǎng)?chuàng)建一個(gè)InvocationHandler實(shí)現(xiàn)類。例如,下面是一個(gè)簡(jiǎn)單的InvocationHandler實(shí)現(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;
    }
}

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

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

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

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

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

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

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

public class ProxyTest {
    public static void main(String[] args) {
        // 創(chuàng)建目標(biāo)對(duì)象
        UserDaoImpl userDao = new UserDaoImpl();
        // 創(chuàng)建MethodInterceptor實(shí)例
        MethodInterceptor methodInterceptor = new MyMethodInterceptor(userDao);
        // 創(chuàng)建代理對(duì)象
        UserDaoImpl proxy = (UserDaoImpl) ProxyFactory.getProxy(userDao.getClass(), methodInterceptor);
        // 調(diào)用代理對(duì)象的方法
        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;
    }
}

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

然后通過(guò)調(diào)用ProxyFactory的getProxy()方法來(lái)生成一個(gè)Cglib動(dòng)態(tài)代理對(duì)象proxy。

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

總結(jié)

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

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

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

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

相關(guān)文章

  • Java結(jié)合Kotlin實(shí)現(xiàn)寶寶年齡計(jì)算

    Java結(jié)合Kotlin實(shí)現(xiàn)寶寶年齡計(jì)算

    這篇文章主要為大家介紹了Java結(jié)合Kotlin實(shí)現(xiàn)寶寶年齡計(jì)算示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • 本地MinIO存儲(chǔ)服務(wù)Java遠(yuǎn)程調(diào)用上傳文件的操作過(guò)程

    本地MinIO存儲(chǔ)服務(wù)Java遠(yuǎn)程調(diào)用上傳文件的操作過(guò)程

    MinIO是一款高性能、分布式的對(duì)象存儲(chǔ)系統(tǒng),它可以100%的運(yùn)行在標(biāo)準(zhǔn)硬件上,即X86等低成本機(jī)器也能夠很好的運(yùn)行MinIO,這篇文章主要介紹了本地MinIO存儲(chǔ)服務(wù)Java遠(yuǎn)程調(diào)用上傳文件的操作過(guò)程,需要的朋友可以參考下
    2023-11-11
  • IDEA 2020.2 +Gradle 6.6.1 + Spring Boot 2.3.4 創(chuàng)建多模塊項(xiàng)目的超詳細(xì)教程

    IDEA 2020.2 +Gradle 6.6.1 + Spring Boot 2.3.4 創(chuàng)建多模塊項(xiàng)目的超詳細(xì)教程

    這篇文章主要介紹了IDEA 2020.2 +Gradle 6.6.1 + Spring Boot 2.3.4 創(chuàng)建多模塊項(xiàng)目的教程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09
  • Maven 錯(cuò)誤找不到符號(hào)的解決方法

    Maven 錯(cuò)誤找不到符號(hào)的解決方法

    這篇文章主要介紹了Maven 錯(cuò)誤找不到符號(hào)的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • SpringMVC+MyBatis 事務(wù)管理(實(shí)例)

    SpringMVC+MyBatis 事務(wù)管理(實(shí)例)

    本文先分析編程式注解事務(wù)和基于注解的聲明式事務(wù)。對(duì)SpringMVC+MyBatis 事務(wù)管理的相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)吧
    2017-08-08
  • RestTemplate使用Proxy代理作為跳板發(fā)送請(qǐng)求

    RestTemplate使用Proxy代理作為跳板發(fā)送請(qǐng)求

    這篇文章主要為大家介紹了RestTemplate使用代理proxy作為跳板發(fā)送請(qǐng)求的方法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-03-03
  • Spring boot @RequestBody數(shù)據(jù)傳遞過(guò)程詳解

    Spring boot @RequestBody數(shù)據(jù)傳遞過(guò)程詳解

    這篇文章主要介紹了Spring boot @RequestBody數(shù)據(jù)傳遞過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • Java中如何避免sql注入實(shí)例詳解

    Java中如何避免sql注入實(shí)例詳解

    SQL注入是最常見(jiàn)的攻擊方式之一,它不是利用操作系統(tǒng)或其它系統(tǒng)的漏洞來(lái)實(shí)現(xiàn)攻擊的,而是程序員因?yàn)闆](méi)有做好判斷,被不法用戶鉆了SQL的空子,下面這篇文章主要給大家介紹了關(guān)于Java中如何避免sql注入的相關(guān)資料,需要的朋友可以參考下
    2022-01-01
  • 如何手動(dòng)安裝Gradle并配置IDEA使用Gradle構(gòu)建

    如何手動(dòng)安裝Gradle并配置IDEA使用Gradle構(gòu)建

    本文給大家分享手動(dòng)安裝Gradle并配置IDEA使用Gradle構(gòu)建的步驟,本文給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧
    2025-04-04
  • Java?Collection接口中的常用方法總結(jié)

    Java?Collection接口中的常用方法總結(jié)

    這篇文章將大概用代碼案例簡(jiǎn)單總結(jié)一下?Collection?接口中的一些方法,我們會(huì)以他的實(shí)現(xiàn)類?Arraylist?為例創(chuàng)建對(duì)象??煲黄饋?lái)看看吧
    2022-12-12

最新評(píng)論