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