摘要:定義代理設(shè)計模式為其他對象提供一種代理以控制對這個對象的訪問。動態(tài)代理代理類在程序運行時創(chuàng)建的代理方式被成為動態(tài)代理。
1.定義
代理設(shè)計模式:為其他對象提供一種代理以控制對這個對象的訪問。
動態(tài)代理:代理類在程序運行時創(chuàng)建的代理方式被成為 動態(tài)代理。代理類并不是在Java代碼中定義的,而而是在運行時根據(jù)我們在Java代碼中的“指示”動態(tài)生成的
2.簡介
Sping mvc的Aop就是基于動態(tài)代理實現(xiàn)的,通過它我們可以很方便的進行日志記錄,性能統(tǒng)計,安全控制,事務(wù)處理,異常處理等,而不用更改業(yè)務(wù)邏輯
3.類圖
image.png
4.實例
package designMode;
import java.io.IOException;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
代理設(shè)計模式:為其他對象提供一種代理以控制對這個對象的訪問。
動態(tài)代理:代理類在程序運行時創(chuàng)建的代理方式被成為 動態(tài)代理。代理類并不是在Java代碼中定義的,而是在運行時根據(jù)我們在Java代碼中的“指示”動態(tài)生成的
*/
public class ProxyPattern {
public static void main(String[] args) throws IOException { Aop aop1 = new Aop(); Subject subject = (Subject) new AopHandler().bind(aop1); subject.doSometing(); } /** * 接口Subject */ interface Subject { void doSometing(); } /** * 要代理的對象(RealSubject) */ static class Aop implements Subject { @Override public void doSometing() { System.out.println("保存數(shù)據(jù)...."); } } /** * 代理類(InvocationHandler ) */ public static class AopHandler implements InvocationHandler { private Object delegate; //運行時創(chuàng)建代理類 public Object bind(Object delegate) { this.delegate = delegate; return Proxy.newProxyInstance( this.delegate.getClass().getClassLoader(), this.delegate.getClass().getInterfaces(), this ); } //動態(tài)代理可以很方便的面向切面編程 @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("開啟事務(wù)..."); method.invoke(delegate); System.out.println("提交事務(wù)..."); return null; } }
}
歡迎加入學(xué)習(xí)交流群569772982,大家一起學(xué)習(xí)交流。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/67764.html
摘要:要明白,動態(tài)代理類的存在意義是為了攔截方法并修改邏輯而動態(tài)代理的局限性之一就是只能攔截接口所聲明的方法。因為動態(tài)代理類是繼承自業(yè)務(wù)類,所以該類和方法不能聲明成無法繼承或重寫。者最終都是生成了一個新的動態(tài)代理類對象。 動態(tài)代理 1、先談靜態(tài)代理 對于靜態(tài)代理,我們已經(jīng)很熟悉了。我們擁有一個抽象類,真實類繼承自抽象類并重寫其業(yè)務(wù)方法,代理類持有真實類的對象實例,在重寫業(yè)務(wù)方法中通過調(diào)用真實...
摘要:這種語法,在中被稱為動態(tài)代理。在動態(tài)代理機制中,這個角色只能是接口。動態(tài)代理就是實現(xiàn)的技術(shù)之一。 所謂動態(tài)代理,指的是語言提供的一種語法,能夠?qū)ο笾胁煌椒ǖ恼{(diào)用重定向到一個統(tǒng)一的處理函數(shù)中來。python重寫__getattr__函數(shù)能夠做到這一點,就連世界上最好的語言也提供稱為魔術(shù)方法的__call。這種語法除了能更好的實現(xiàn)動態(tài)代理外,還是RPC框架實現(xiàn)原理的一部分。 動態(tài)代理...
摘要:動態(tài)代理又被稱為代理或接口代理。靜態(tài)代理在編譯時產(chǎn)生字節(jié)碼文件,可以直接使用,效率高。代理無需實現(xiàn)接口,通過生成類字節(jié)碼實現(xiàn)代理,比反射稍快,不存在性能問題,但會繼承目標(biāo)對象,需要重寫方法,所以目標(biāo)對象不能為類。 一、代理模式介紹 代理模式是一種設(shè)計模式,提供了對目標(biāo)對象額外的訪問方式,即通過代理對象訪問目標(biāo)對象,這樣可以在不修改原目標(biāo)對象的前提下,提供額外的功能操作,擴展目標(biāo)對象的功...
摘要:類所實現(xiàn)的方法包裝了對被代理對象的反射調(diào)用,后文中的動態(tài)代理類正是調(diào)用此方法來調(diào)用被代理對象的方法。 前言 java的設(shè)計模式中有一項設(shè)計模式叫做代理模式,所謂代理模式,就是通過代理方來操作目標(biāo)對象,而不是自己直接調(diào)用。代理又分為靜態(tài)代理和動態(tài)代理,靜態(tài)代理就是針對每個被代理對象寫一個代理類,操作不夠優(yōu)雅;動態(tài)代理,可以根據(jù)接口動態(tài)的生成代理類,這動態(tài)生成的類不需要自己書寫,jdk幫你...
摘要:代理模式基本概念不論是靜態(tài)代理還是動態(tài)代理其本質(zhì)都是代理模式的一種實現(xiàn)那么什么是代理模式呢代理模式即給某一個對象提供一個代理并由代理對象控制對原對象的引用代理模式其實取材于實際生活例如我們生活中常見的房屋租賃代理我們在租房時一般不是直接和房 代理模式 基本概念 不論是靜態(tài)代理還是動態(tài)代理, 其本質(zhì)都是代理模式的一種實現(xiàn), 那么什么是代理模式呢?代理模式, 即給某一個對象提供一個代理, ...
摘要:除了和外,我們還有最后一招我直接把一個代理類的源代碼用字符串拼出來,然后基于這個字符串調(diào)用的編譯期,動態(tài)的創(chuàng)建一個新的文件,然后動態(tài)編譯這個文件,這樣也能得到一個新的代理類。 面試問題:Java里的代理設(shè)計模式(Proxy Design Pattern)一共有幾種實現(xiàn)方式?這個題目很像孔乙己問茴香豆的茴字有哪幾種寫法? showImg(https://segmentfault.com/...
閱讀 2011·2021-11-15 17:58
閱讀 2203·2021-10-19 11:45
閱讀 3638·2021-09-02 15:40
閱讀 2662·2021-07-25 10:50
閱讀 3817·2019-08-30 15:56
閱讀 3215·2019-08-30 12:44
閱讀 1081·2019-08-26 13:38
閱讀 1929·2019-08-23 18:29