摘要:說明我們創(chuàng)建時(shí)傳入了一個(gè)對(duì)象。在這個(gè)對(duì)象里我們調(diào)用了被代理的那個(gè)對(duì)象的方法,并且在其前后附加了方法。切面在指定的連接點(diǎn)被織入到目標(biāo)對(duì)象中。因?yàn)椴捎脛?dòng)態(tài)代理,所以是在運(yùn)行期完成織入。中的代理一個(gè)類被織入增強(qiáng)后,就產(chǎn)生一個(gè)結(jié)果代理類
說明:圖片是我其它地方博客里的
package dproxy; /** *抽象主題 **/ interface Subject { void subjectMethod(int a,int b); } /** *具體主題 **/ /** *實(shí)現(xiàn)了Subject接口,并且覆蓋了subjectMethod方法 **/ package dproxy; public class RealSubject implements Subject { //Joinpoint連接點(diǎn) @Override public void subjectMethod(int a, int b) { // TODO Auto-generated method stub System.out.println(a+"+"+b +"="+(a+b)); } } /** *代理處理 **/ package dproxy; import java.lang.reflect.InvocationHandler; //Aspect(方面)??? public class ProxyHandler implements InvocationHandler { private Object subject; public ProxyHandler(Object subject) { // TODO Auto-generated constructor stub this.subject = subject; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { before(); // TODO Auto-generated method stub System.out.println("調(diào)用真實(shí)主題的方法"); /** *用反射機(jī)制調(diào)用了realMethod方法 **/ method.invoke(subject, args); after(); return null; } //Advice(通知) public void before() { System.out.println("代理前的處理操作"); } //Advice(通知) public void after() { System.out.println("代理后的處理操作"); } }
invoke方法參數(shù)說明: invoke方法的第一個(gè)參數(shù)是 proxy 是 Proxy.newProxyInstance 創(chuàng)建的對(duì)象,我在網(wǎng)上看到很多文章說這個(gè)參數(shù)是被代理類的對(duì)象即RealSubject的對(duì)象,這種說法是錯(cuò)誤的,大家可以用RTTI對(duì)proxy進(jìn)行了解,它確實(shí)是 Proxy.newProxyInstance 創(chuàng)建的對(duì)象
構(gòu)造器說明: ProxyHandler() 構(gòu)造器接受一個(gè)參數(shù),這個(gè)參數(shù)是被代理類即RealSubject的對(duì)象。
invoke內(nèi)部解析: 我們?cè)?invoke 函數(shù)里面 通過 method.invoke(subject, args); 調(diào)用了真實(shí)主題,即被代理對(duì)象的某一個(gè)方法,注意 invoke的第二個(gè)參數(shù)是 method 它指明調(diào)用被代理對(duì)象的哪一個(gè)方法,第三個(gè)參數(shù)是該方法的參數(shù)。
package dproxy; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class Client { public static void main(String[] args) { // TODO Auto-generated method stub /** *創(chuàng)建真實(shí)主題 **/ Subject realSubject = new RealSubject(); /** *創(chuàng)建代理處理器 **/ ProxyHandler handler = new ProxyHandler(realSubject); /** *創(chuàng)建代理對(duì)象 **/ Subject proxy = (Subject) Proxy.newProxyInstance(realSubject.getClass() .getClassLoader(), realSubject.getClass().getInterfaces(), handler); /** *調(diào)用動(dòng)態(tài)創(chuàng)建的代理對(duì)象的動(dòng)態(tài)生成的subjectMethod方法 **/ proxy.subjectMethod(3, 5); //執(zhí)行了3+5操作 并在該操作前后調(diào)用了附加方法 } }
說明1:Proxy.newProxyInstance創(chuàng)建了一個(gè)代理對(duì)象,并且以Subject的身份去調(diào)用一個(gè)貌似和Subject類一模一樣的接口subjectMethod由于 proxy對(duì)象是Subject類型的 即 Subject proxy ,所以我們執(zhí)行 proxy.subjectMethod(3, 5);時(shí)感覺不到在用代理。
說明2:我們創(chuàng)建proxy時(shí)傳入了一個(gè)handler對(duì)象。在這個(gè)對(duì)象里我們調(diào)用了被代理的那個(gè)對(duì)象的方法,并且在其前后附加了方法。
執(zhí)行流程:
1 在Client 創(chuàng)建了一個(gè)被代理的對(duì)象 realSubject
2 創(chuàng)建了一個(gè)代理處理器,這里是代理處理器,并不是代理類,因?yàn)樗皇?b>Subject類型,也沒有和Subject內(nèi)部長(zhǎng)的一樣的函數(shù)所以它不是代理對(duì)象,但是它對(duì)真實(shí)對(duì)象,即realSubject 對(duì)象的調(diào)用時(shí)由這個(gè)對(duì)象代替代理類來做的。也就是代理類將對(duì)被代理對(duì)象的調(diào)用的職責(zé)委托給了這個(gè)代理處理器
3 Proxy 類創(chuàng)建了一個(gè)對(duì)象,然后這個(gè)類通過 java反射機(jī)制 將創(chuàng)建的這個(gè)對(duì)象變的類型變成了Subject,創(chuàng)建的這個(gè)對(duì)象內(nèi)部有一個(gè)代理處理器對(duì)象handler
4 由3創(chuàng)建的那個(gè)代理對(duì)象,執(zhí)行proxy.subjectMethod(3, 5);以Subject的身份調(diào)用了一個(gè)和Subject接口中的某個(gè)函數(shù)長(zhǎng)的一樣的一個(gè)函數(shù),這是因?yàn)?b>proxy是Subject類型的一個(gè)對(duì)象
5 proxy在subjectMethod函數(shù)內(nèi)部將對(duì)被代理對(duì)象的調(diào)用委托給了代理處理器對(duì)象handler
和spring AOP 的關(guān)系
AOP 中的 Advice通知 就是我們?cè)诒淮矸椒▓?zhí)行前后附加的方法
AOP 中的 Joinpoint連接點(diǎn) 就是我們需要執(zhí)行的那個(gè) 3+5的方法
AOP 中的 Aspect方面 如果我們將所有的 Advice通知 提取出來放在 一個(gè)類中就構(gòu)成 了 Aspect方面
AOP 中的 Pointcut切入點(diǎn) 是所有符合相同規(guī)則的連接點(diǎn)的集合,例如所有以do開頭的方法,切入點(diǎn)內(nèi)包含一套規(guī)則用來說明該切入點(diǎn)包含哪些鏈接點(diǎn)
AOP 中的Introduction(引介) 引介是一種特殊的通知在不修改類代碼的前提下, Introduction可以在運(yùn)行期為類動(dòng)態(tài)地添加一些方法或Field
AOP 中的Target(目標(biāo)對(duì)象) 代理的目標(biāo)對(duì)象(要增強(qiáng)的類)
AOP 中的織入 Weaving把切面應(yīng)用到目標(biāo)對(duì)象并創(chuàng)建新的代理對(duì)象的過程。切面在指定的連接點(diǎn)被織入到目標(biāo)對(duì)象中??椚肟梢栽趯?duì)象生命周期的編譯期、類加載期、運(yùn)行期完成。Spring AOP 因?yàn)椴捎脛?dòng)態(tài)代理,所以是在 運(yùn)行期 完成織入。
AOP 中的Proxy(代理) 一個(gè)類被AOP織入增強(qiáng)后,就產(chǎn)生一個(gè)結(jié)果代理類
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/65125.html
摘要:是一種特殊的增強(qiáng)切面切面由切點(diǎn)和增強(qiáng)通知組成,它既包括了橫切邏輯的定義也包括了連接點(diǎn)的定義。實(shí)際上,一個(gè)的實(shí)現(xiàn)被拆分到多個(gè)類中在中聲明切面我們知道注解很方便,但是,要想使用注解的方式使用就必須要有源碼因?yàn)槲覀円? 前言 只有光頭才能變強(qiáng) 上一篇已經(jīng)講解了Spring IOC知識(shí)點(diǎn)一網(wǎng)打盡!,這篇主要是講解Spring的AOP模塊~ 之前我已經(jīng)寫過一篇關(guān)于AOP的文章了,那篇把比較重要的知...
摘要:,,面向切面編程。,切點(diǎn),切面匹配連接點(diǎn)的點(diǎn),一般與切點(diǎn)表達(dá)式相關(guān),就是切面如何切點(diǎn)。例子中,注解就是切點(diǎn)表達(dá)式,匹配對(duì)應(yīng)的連接點(diǎn),通知,指在切面的某個(gè)特定的連接點(diǎn)上執(zhí)行的動(dòng)作。,織入,將作用在的過程。因?yàn)樵创a都是英文寫的。 之前《零基礎(chǔ)帶你看Spring源碼——IOC控制反轉(zhuǎn)》詳細(xì)講了Spring容器的初始化和加載的原理,后面《你真的完全了解Java動(dòng)態(tài)代理嗎?看這篇就夠了》介紹了下...
摘要:入門和學(xué)習(xí)筆記概述框架的核心有兩個(gè)容器作為超級(jí)大工廠,負(fù)責(zé)管理創(chuàng)建所有的對(duì)象,這些對(duì)象被稱為。中的一些術(shù)語切面切面組織多個(gè),放在切面中定義。 Spring入門IOC和AOP學(xué)習(xí)筆記 概述 Spring框架的核心有兩個(gè): Spring容器作為超級(jí)大工廠,負(fù)責(zé)管理、創(chuàng)建所有的Java對(duì)象,這些Java對(duì)象被稱為Bean。 Spring容器管理容器中Bean之間的依賴關(guān)系,使用一種叫做依賴...
摘要:總結(jié)動(dòng)態(tài)代理的相關(guān)原理已經(jīng)講解完畢,接下來讓我們回答以下幾個(gè)思考題。 【干貨點(diǎn)】 此處是【好好面試】系列文的第12篇文章。文章目標(biāo)主要是通過原理剖析的方式解答Aop動(dòng)態(tài)代理的面試熱點(diǎn)問題,通過一步步提出問題和了解原理的方式,我們可以記得更深更牢,進(jìn)而解決被面試官卡住喉嚨的情況。問題如下 SpringBoot默認(rèn)代理類型是什么 為什么不用靜態(tài)代理 JDK動(dòng)態(tài)代理原理 CGLIB動(dòng)態(tài)代理...
摘要:使用與的靜態(tài)代理不同,使用的動(dòng)態(tài)代理,所謂的動(dòng)態(tài)代理就是說框架不會(huì)去修改字節(jié)碼,而是在內(nèi)存中臨時(shí)為方法生成一個(gè)對(duì)象,這個(gè)對(duì)象包含了目標(biāo)對(duì)象的全部方法,并且在特定的切點(diǎn)做了增強(qiáng)處理,并回調(diào)原對(duì)象的方法。 AOP(Aspect Orient Programming),我們一般稱為面向方面(切面)編程,作為面向?qū)ο蟮囊环N補(bǔ)充,用于處理系統(tǒng)中分布于各個(gè)模塊的橫切關(guān)注點(diǎn),比如事務(wù)管理、日志、緩存...
摘要:又是什么其實(shí)就是一種實(shí)現(xiàn)動(dòng)態(tài)代理的技術(shù),利用了開源包,先將代理對(duì)象類的文件加載進(jìn)來,之后通過修改其字節(jié)碼并且生成子類。 在實(shí)際研發(fā)中,Spring是我們經(jīng)常會(huì)使用的框架,畢竟它們太火了,也因此Spring相關(guān)的知識(shí)點(diǎn)也是面試必問點(diǎn),今天我們就大話Aop。特地在周末推文,因?yàn)樵撈恼麻喿x起來還是比較輕松詼諧的,當(dāng)然了,更主要的是周末的我也在充電學(xué)習(xí),希望有追求的朋友們也盡量不要放過周末時(shí)...
閱讀 635·2023-04-26 01:53
閱讀 2760·2021-11-17 17:00
閱讀 2895·2021-09-04 16:40
閱讀 1995·2021-09-02 15:41
閱讀 844·2019-08-26 11:34
閱讀 1234·2019-08-26 10:16
閱讀 1342·2019-08-23 17:51
閱讀 830·2019-08-23 16:50