国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

設(shè)計模式 代理模式(靜態(tài)代理 動態(tài)代理) 與 Spring Aop源碼分析 具體是如何創(chuàng)建Aop代理的

這篇具有很好參考價值的文章主要介紹了設(shè)計模式 代理模式(靜態(tài)代理 動態(tài)代理) 與 Spring Aop源碼分析 具體是如何創(chuàng)建Aop代理的。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

代理模式

代理模式是一種結(jié)構(gòu)型設(shè)計模式,它通過創(chuàng)建一個代理對象來控制對真實對象的訪問。這種模式可以用于提供額外的功能操作,或者擴(kuò)展目標(biāo)對象的功能。

在代理模式中,代理對象與真實對象實現(xiàn)相同的接口,以便在任何地方都可以使用相同的接口來調(diào)用真實對象的方法。這樣做的好處是可以在不改變原始代碼的情況下,增加或修改代碼的行為。

根據(jù)創(chuàng)建代理對象的方式和時機(jī),代理模式可以被分為靜態(tài)代理、動態(tài)代理等類型。其中,靜態(tài)代理是由程序員在編譯時期就定義好的代理類,而動態(tài)代理則是在程序運行時期通過Java反射機(jī)制動態(tài)生成的。

在實際生活中,有許多應(yīng)用了代理模式的場景,例如租房、賣房、家政等業(yè)務(wù),通常由中介機(jī)構(gòu)作為代理來進(jìn)行操作。

靜態(tài)代理

靜態(tài)代理在編譯期間就已經(jīng)確定代理類的代碼。具體來說,要實現(xiàn)靜態(tài)代理需要手動編寫代理類的代碼,因此這種方式的靈活性相對較差,但由于代理類是直接編寫的,所以其運行效率較高。

首先定義購房者的行為

/**
 * 購房者
 *
 * @author LionLi
 */
public interface Homebuyer {

    /**
     * 需求
     */
    String need();

    /**
     * 購買
     */
    void buy();
}

定義真實購房者

/**
 * 購房者 張三
 *
 * @author LionLi
 */
public class Zhangsan implements Homebuyer {

    /**
     * 需求
     */
    @Override
    public String need() {
        String need = "100平以上三室兩廳兩衛(wèi)";
        System.out.println("張三: " + need);
        return need;
    }

    /**
     * 購買
     */
    @Override
    public void buy() {
        System.out.println("張三: 我已付款");
    }
}
/**
 * 購房者 王五
 *
 * @author LionLi
 */
public class Wangwu implements Homebuyer {

    /**
     * 需求
     */
    @Override
    public String need() {
        String need = "70平左右兩室一廳";
        System.out.println("王五: " + need);
        return need;
    }

    /**
     * 購買
     */
    @Override
    public void buy() {
        System.out.println("張三: 我已付款");
    }
}

定義房產(chǎn)中介

/**
 * 房產(chǎn)中介代理人
 *
 * @author LionLi
 */
public class HouseAgentProxy implements Homebuyer {
    private Homebuyer homebuyer;

    public HouseAgentProxy(Homebuyer homebuyer) {
        this.homebuyer = homebuyer;
    }

    @Override
    public String need() {
        System.out.println("中介: 你對房子有什么需求 放心交給我");
        String need = homebuyer.need();
        System.out.println("中介: 尋找房源中........");
        System.out.println("中介: 尋找房源中........");
        System.out.println("中介: 尋找房源中........");
        String str = "中介: 為您找到" + need + "的房子";
        System.out.println(str);
        return str;
    }

    @Override
    public void buy() {
        System.out.println("中介: 請支付購買房子");
        homebuyer.buy();
        System.out.println("中介: 合同生效中.....");
        System.out.println("中介: 房證辦理中.....");
        System.out.println("中介: 恭喜您 這套房子屬于您了");
    }
}

測試

/**
 * @author LionLi
 */
public class Test {

    public static void main(String[] args) {
        Homebuyer zhangsan = new Zhangsan();
        HouseAgentProxy agent1 = new HouseAgentProxy(zhangsan);
        agent1.need();
        agent1.buy();
        System.out.println("-----------------------------");
        Homebuyer wangwu = new Wangwu();
        HouseAgentProxy agent2 = new HouseAgentProxy(wangwu);
        agent2.need();
        agent2.buy();
    }
}

設(shè)計模式 代理模式(靜態(tài)代理 動態(tài)代理) 與 Spring Aop源碼分析 具體是如何創(chuàng)建Aop代理的,設(shè)計模式,springboot經(jīng)驗總結(jié),代理模式,設(shè)計模式,靜態(tài)代理,動態(tài)代理,spring aop源碼分析

兩位購房者分別根據(jù)需求在中介的帶領(lǐng)下買到了房子 真是可喜可賀啊

動態(tài)代理

動態(tài)代理允許在運行時動態(tài)地創(chuàng)建代理對象。代理對象可以在調(diào)用實際對象的方法前后執(zhí)行一些額外的操作,比如日志記錄、權(quán)限檢查等。

動態(tài)代理的實現(xiàn)方式有兩種:基于接口和基于繼承。基于接口的方式是最常用的,它使用Java的反射機(jī)制來實現(xiàn)代理對象。基于繼承的方式則需要創(chuàng)建一個實現(xiàn)了目標(biāo)類接口的子類,并重寫其中的方法。

優(yōu)點: 可以降低系統(tǒng)的耦合度,提高代碼的可維護(hù)性和可擴(kuò)展性。
缺點: 需要使用反射機(jī)制,性能比靜態(tài)代理略低。

首先定義購房者的行為與實際購房者

使用上方代碼不變

定義房產(chǎn)中介

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 動態(tài)房產(chǎn)中介代理人
 *
 * @author LionLi
 */
public class DynamicHouseAgentProxy implements InvocationHandler {
    private Homebuyer homebuyer;

    public Homebuyer getInstance(Homebuyer homebuyer) {
        this.homebuyer = homebuyer;
        return (Homebuyer) Proxy.newProxyInstance(homebuyer.getClass().getClassLoader(), homebuyer.getClass().getInterfaces(), this);
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        if (method.getName().equals("need")) {
            System.out.println("中介: 你對房子有什么需求 放心交給我");
            String need = (String) method.invoke(homebuyer, args);
            System.out.println("中介: 尋找房源中........");
            System.out.println("中介: 尋找房源中........");
            System.out.println("中介: 尋找房源中........");
            String str = "中介: 為您找到" + need + "的房子";
            System.out.println(str);
            return str;
        } else if (method.getName().equals("buy")) {
            System.out.println("中介: 請支付購買房子");
            Object invoke = method.invoke(homebuyer, args);
            System.out.println("中介: 合同生效中.....");
            System.out.println("中介: 房證辦理中.....");
            System.out.println("中介: 恭喜您 這套房子屬于您了");
            return invoke;
        }
        return null;
    }
}

測試

/**
 * @author LionLi
 */
public class Test {

    public static void main(String[] args) {
        DynamicHouseAgentProxy agent = new DynamicHouseAgentProxy();
        Homebuyer zhangsan = new Zhangsan();
        Homebuyer proxy1 = agent.getInstance(zhangsan);
        proxy1.need();
        proxy1.buy();
        System.out.println("-----------------------------");
        Homebuyer wangwu = new Wangwu();
        Homebuyer proxy2 = agent.getInstance(wangwu);
        proxy2.need();
        proxy2.buy();
    }

}

設(shè)計模式 代理模式(靜態(tài)代理 動態(tài)代理) 與 Spring Aop源碼分析 具體是如何創(chuàng)建Aop代理的,設(shè)計模式,springboot經(jīng)驗總結(jié),代理模式,設(shè)計模式,靜態(tài)代理,動態(tài)代理,spring aop源碼分析
結(jié)果不變 兩位購房者成功買到房子

Cglib動態(tài)代理

其他代碼不變只變更中介類

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * 動態(tài)房產(chǎn)中介代理人
 *
 * 這里由于cglib已經(jīng)不支持jdk17了 所以我們使用spring內(nèi)部自帶的cglib工具
 *
 * @author LionLi
 */
public class DynamicHouseAgentProxy implements MethodInterceptor {

    public Homebuyer getInstance(Homebuyer homebuyer) {
        Enhancer enhancer = new Enhancer();
        // 設(shè)置繼承父類
        enhancer.setSuperclass(homebuyer.getClass());
        // 設(shè)置回調(diào)
        enhancer.setCallback(this);
        return (Homebuyer) enhancer.create();
    }

    @Override
    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
        if (method.getName().equals("need")) {
            System.out.println("中介: 你對房子有什么需求 放心交給我");
            String need = (String) proxy.invokeSuper(obj, args);
            System.out.println("中介: 尋找房源中........");
            System.out.println("中介: 尋找房源中........");
            System.out.println("中介: 尋找房源中........");
            String str = "中介: 為您找到" + need + "的房子";
            System.out.println(str);
            return str;
        } else if (method.getName().equals("buy")) {
            System.out.println("中介: 請支付購買房子");
            Object invoke = proxy.invokeSuper(obj, args);
            System.out.println("中介: 合同生效中.....");
            System.out.println("中介: 房證辦理中.....");
            System.out.println("中介: 恭喜您 這套房子屬于您了");
            return invoke;
        }
        return null;
    }
}

Spring中代理模式的應(yīng)用

要說起Spring中的代理模式 要首當(dāng)其沖的肯定是AOP了 接下來我們來看看在AOP中是如何使用代理模式的

這里涉及到一個注解 學(xué)過AOP的都知道 如果需要開啟AOP那么需要增加這個注解

設(shè)計模式 代理模式(靜態(tài)代理 動態(tài)代理) 與 Spring Aop源碼分析 具體是如何創(chuàng)建Aop代理的,設(shè)計模式,springboot經(jīng)驗總結(jié),代理模式,設(shè)計模式,靜態(tài)代理,動態(tài)代理,spring aop源碼分析

通過搜索找到 AspectJAutoProxyRegistrar 類, 該方法的作用就是往Spring容器中添加一個 BeanDefinition 類型為 AnnotationAwareAspectJAutoProxyCreator 用于創(chuàng)建代理對象

設(shè)計模式 代理模式(靜態(tài)代理 動態(tài)代理) 與 Spring Aop源碼分析 具體是如何創(chuàng)建Aop代理的,設(shè)計模式,springboot經(jīng)驗總結(jié),代理模式,設(shè)計模式,靜態(tài)代理,動態(tài)代理,spring aop源碼分析
設(shè)計模式 代理模式(靜態(tài)代理 動態(tài)代理) 與 Spring Aop源碼分析 具體是如何創(chuàng)建Aop代理的,設(shè)計模式,springboot經(jīng)驗總結(jié),代理模式,設(shè)計模式,靜態(tài)代理,動態(tài)代理,spring aop源碼分析

接下來我們進(jìn)入 AnnotationAwareAspectJAutoProxyCreator 看看是如何創(chuàng)建代理的

由于 AnnotationAwareAspectJAutoProxyCreator 中并沒有創(chuàng)建代理的方法 那么我們只能向上去父類里找, 通過不斷的探索在 AnnotationAwareAspectJAutoProxyCreator -> AspectJAwareAdvisorAutoProxyCreator -> AbstractAdvisorAutoProxyCreator -> AbstractAutoProxyCreator 抽象類 AbstractAutoProxyCreator 中找到了 createProxy 方法

設(shè)計模式 代理模式(靜態(tài)代理 動態(tài)代理) 與 Spring Aop源碼分析 具體是如何創(chuàng)建Aop代理的,設(shè)計模式,springboot經(jīng)驗總結(jié),代理模式,設(shè)計模式,靜態(tài)代理,動態(tài)代理,spring aop源碼分析
此方法是bean初始化的前置處理器 postProcessBeforeInstantiation 中使用的, 也就是說bean在初始化之前, 代理對象就已經(jīng)創(chuàng)建好了

進(jìn)入 createProxy 方法

設(shè)計模式 代理模式(靜態(tài)代理 動態(tài)代理) 與 Spring Aop源碼分析 具體是如何創(chuàng)建Aop代理的,設(shè)計模式,springboot經(jīng)驗總結(jié),代理模式,設(shè)計模式,靜態(tài)代理,動態(tài)代理,spring aop源碼分析

進(jìn)入 buildProxy 方法

設(shè)計模式 代理模式(靜態(tài)代理 動態(tài)代理) 與 Spring Aop源碼分析 具體是如何創(chuàng)建Aop代理的,設(shè)計模式,springboot經(jīng)驗總結(jié),代理模式,設(shè)計模式,靜態(tài)代理,動態(tài)代理,spring aop源碼分析
設(shè)計模式 代理模式(靜態(tài)代理 動態(tài)代理) 與 Spring Aop源碼分析 具體是如何創(chuàng)建Aop代理的,設(shè)計模式,springboot經(jīng)驗總結(jié),代理模式,設(shè)計模式,靜態(tài)代理,動態(tài)代理,spring aop源碼分析

這里我們可以看出 實際的代理對象是通過 ProxyFactory 工廠的 getProxyClassgetProxy 兩個方法創(chuàng)建的

我們來看一下這兩個方法具體實現(xiàn)

通過 getProxyClass 方法一直往下點 找到最終創(chuàng)建方法 DefaultAopProxyFactory#createAopProxy 為止
設(shè)計模式 代理模式(靜態(tài)代理 動態(tài)代理) 與 Spring Aop源碼分析 具體是如何創(chuàng)建Aop代理的,設(shè)計模式,springboot經(jīng)驗總結(jié),代理模式,設(shè)計模式,靜態(tài)代理,動態(tài)代理,spring aop源碼分析
設(shè)計模式 代理模式(靜態(tài)代理 動態(tài)代理) 與 Spring Aop源碼分析 具體是如何創(chuàng)建Aop代理的,設(shè)計模式,springboot經(jīng)驗總結(jié),代理模式,設(shè)計模式,靜態(tài)代理,動態(tài)代理,spring aop源碼分析
設(shè)計模式 代理模式(靜態(tài)代理 動態(tài)代理) 與 Spring Aop源碼分析 具體是如何創(chuàng)建Aop代理的,設(shè)計模式,springboot經(jīng)驗總結(jié),代理模式,設(shè)計模式,靜態(tài)代理,動態(tài)代理,spring aop源碼分析

最后我們來分析最終是如何創(chuàng)建代理對象的

設(shè)計模式 代理模式(靜態(tài)代理 動態(tài)代理) 與 Spring Aop源碼分析 具體是如何創(chuàng)建Aop代理的,設(shè)計模式,springboot經(jīng)驗總結(jié),代理模式,設(shè)計模式,靜態(tài)代理,動態(tài)代理,spring aop源碼分析文章來源地址http://www.zghlxwxcb.cn/news/detail-807124.html

到了這里,關(guān)于設(shè)計模式 代理模式(靜態(tài)代理 動態(tài)代理) 與 Spring Aop源碼分析 具體是如何創(chuàng)建Aop代理的的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 設(shè)計模式8:代理模式-動態(tài)代理

    上一篇:設(shè)計模式8:代理模式-靜態(tài)代理 “動態(tài)”的含義是 代碼生成代理類,一個代理類可以代理多個接口 。 動態(tài)區(qū)別于 死板 ,靜態(tài)代理中一個代理類只能代理一個接口,其他不同的接口,就需要再手寫不同的代理類,這就很 死板 。 動態(tài)代理類似于在安卓里面,我們常

    2024年02月09日
    瀏覽(31)
  • 設(shè)計模式的使用——模板方法模式+動態(tài)代理模式

    設(shè)計模式的使用——模板方法模式+動態(tài)代理模式

    一、需求介紹 ??現(xiàn)有自己寫的的一套審批流程邏輯,由于代碼重構(gòu),需要把以前的很多業(yè)務(wù)加上審批的功能,再執(zhí)行完審批與原有業(yè)務(wù)之后,生成一個任務(wù),然后再統(tǒng)一處理一個任務(wù)(本來是通過數(shù)據(jù)庫作業(yè)去處理的,后來說這個任務(wù)要馬上去處理,只能去統(tǒng)一添加一個處

    2024年02月10日
    瀏覽(27)
  • Java 設(shè)計者模式以及與Spring關(guān)系(四) 代理模式

    Java 設(shè)計者模式以及與Spring關(guān)系(四) 代理模式

    目錄 簡介: 23設(shè)計者模式以及重點模式 代理模式(Proxy Pattern) 靜態(tài)代理示例 spring中應(yīng)用 動態(tài)代理 1.基于JDK的動態(tài)代理 target.getClass().getInterfaces()作用 內(nèi)名內(nèi)部類寫法(更簡潔,但不推薦) 2.基于CGLIB實現(xiàn) spring中應(yīng)用 本文是個系列一次會出兩個設(shè)計者模式作用,如果有關(guān)聯(lián)就三

    2024年01月23日
    瀏覽(92)
  • 設(shè)計模式——命令模式(Command Pattern)+ Spring相關(guān)源碼

    類型: 行為型模式 目的: 將一個請求封裝成一個對象,從而使您可以用不同的請求對客戶進(jìn)行參數(shù)化。 2.1.1 定義命令類接口 2.1.2 定義命令執(zhí)行者 2.1.3 被處理對象Stock。 菜鳥教程定義 被處理的對象 是Stock。 2.1.4 封裝處理Stock的命令 雖然 Runnable 接口本身并不是一個命令模式

    2024年02月06日
    瀏覽(25)
  • 設(shè)計模式——迭代器模式(Iterator Pattern)+ Spring相關(guān)源碼

    類型: 行為型模式 目的: 用于順序訪問集合對象的元素,使用者不需要知道集合對象的底層表示。 2.1.1 定義迭代器接口 2.1.2 定義迭代對象接口——用于返回一個迭代器 2.1.3 實現(xiàn) 迭代對象 和 迭代器 2.1.4 使用 迭代器CompositeIterator 創(chuàng)建型模式 結(jié)構(gòu)型模式 1、設(shè)計模式——裝

    2024年02月05日
    瀏覽(29)
  • 設(shè)計模式——裝飾器模式(Decorator Pattern)+ Spring相關(guān)源碼

    別名:包裝模式(Wrapper Pattern) 類型:結(jié)構(gòu)型模式。 目的:指在不改變現(xiàn)有對象結(jié)構(gòu)的情況下,動態(tài)地給該對象增加一些職責(zé)額外功能。 給對象添加新功能時,并不是在對象類中直接添加,而是在裝飾器類中添加。 在裝飾類中添加新功能,你可以增強原先對象的方法,也可

    2024年02月06日
    瀏覽(19)
  • JAVA設(shè)計模式第七講:設(shè)計模式在 Spring 源碼中的應(yīng)用

    JAVA設(shè)計模式第七講:設(shè)計模式在 Spring 源碼中的應(yīng)用

    設(shè)計模式(design pattern)是對軟件設(shè)計中普遍存在的各種問題,所提出的解決方案。本文以面試題作為切入點,介紹了設(shè)計模式的常見問題。 我們需要掌握各種設(shè)計模式的原理、實現(xiàn)、設(shè)計意圖和應(yīng)用場景,搞清楚能解決什么問題 。 本文是第七篇:設(shè)計模式在 Spring 源碼中的

    2024年02月09日
    瀏覽(28)
  • 設(shè)計模式——觀察者模式(Observer Pattern)+ Spring相關(guān)源碼

    類型:行為型模式 目的:當(dāng)一個對象的狀態(tài)發(fā)生改變時,其所有依賴者(觀察者)都會收到通知并自動更新。 2.1.1 定義觀察者 2.1.2 定義被觀察對象 2.1.3 使用 2.2.1 觀察者接口Observer 2.2.1 被觀察者對象Observable 2.3.1 觀察者 2.3.2 被觀察者 創(chuàng)建型模式 結(jié)構(gòu)型模式 1、設(shè)計模式——

    2024年02月06日
    瀏覽(23)
  • Spring | Srping AOP (AOP簡介、動態(tài)代理、基于“代理類”的AOP實現(xiàn))

    Spring | Srping AOP (AOP簡介、動態(tài)代理、基于“代理類”的AOP實現(xiàn))

    作者簡介 :一只大皮卡丘,計算機(jī)專業(yè)學(xué)生,正在努力學(xué)習(xí)、努力敲代碼中! 讓我們一起繼續(xù)努力學(xué)習(xí)! 該文章 參考學(xué)習(xí)教材 為: 《Java EE企業(yè)級應(yīng)用開發(fā)教程 (Spring + Spring MVC +MyBatis)》 黑馬程序員 / 編著 文章以課本知識點 + 代碼為主線,結(jié)合自己看書學(xué)習(xí)過程中的理解和

    2024年01月22日
    瀏覽(18)
  • 動態(tài)代理與Spring Aop

    動態(tài)代理與Spring Aop

    JDK 動態(tài)代理 使用JAVA反射包中的類和接口實現(xiàn)動態(tài)代理的功能,JAVA.lang.reflect包;主要是三個類: InvocationHandler,Method,Proxy; CGLIB動態(tài)代理,第三方工具類庫,創(chuàng)建代理對象,cglib的原理是繼承,通過繼承目標(biāo)類,創(chuàng)建它的子類,在子類中重寫父類中同名的方法,實現(xiàn)功能的修改

    2024年02月11日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包