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