您好,登錄后才能下訂單哦!
如何進行AOP開發中的Java動態代理,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
1.AOP的概念:Aspect Oriented Programming 面向切面編程,可以通過預編譯方式和運行期動態代理實現在不修改源代碼的情況下給程序動態統一添加功能的一種技術。
2.OOP與AOP的區別:如果說面向對象編程是關注將需求功能劃分為不同的并且相對獨立,封裝良好的類,并讓它們有著屬于自己的行為,依靠繼承和多態等來定義彼此的關系的話;那么面向方面編程則是希望能夠將通用需求功能從不相關的類當中分離出來。
3.AOP的應用范圍:日志記錄,性能統計,安全控制,事務處理,異常處理等等。
Spring中的AOP編程的風格主要有基于XML配置文件、基于注解兩種,我們這里以注解為例。
(1.)?表示可以不配置,也就是說只有方法的名字name-pattern、方法的參數param-pattern是必須的。對于param-pattern之外的其余部分,可以使用*作為通配符,表示任意,例如:execution (* *.m(..))就是執行任意返回值、任意類中的m方法時進行織入。
(2.)參數的通配配稍微復雜一些,其中(..)表示參數為0個或者多個,且類型任意;(*)表示任意類型的一個參數;(*,String)表示第一個參數為任意類型,第二個參數為String類型;什么都不寫表示無參數。
(3.)多個表達式可以使用&&、||、!進行運算,因為表達式返回的是布爾值。
反射機制的概念:在運行時,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調用它的任意一個方法;這種動態獲取的信息以及動態調用對象的方法的功能稱為java語言的反射機制。
及他們對應的set方法,然后你就可以在Action中獲取上面的三個字段的值了。可是作為Struts2框架,Apache在開發的時候這個框架的時候,怎么知道我們Action里有這幾個字段的呢?因為Struts2里使用了反射看透了你的Action。
代理設計模式:為其他對象提供一種代理以控制對這個對象的訪問。說白了就是去掉客戶不能看到的內容和服務或者增添客戶需要的額外服務。
常用的代理設計模式:
但不管是那種方法,都是在編譯期完成的代理,不能像Spring那樣在運行期動態的對指定的類完成代理。
JAVA自帶的動態代理是基于java.lang.reflect.Proxy、java.lang.reflect.InvocationHandler兩個類來完成的,使用JAVA反射機制。
Proxy類中的幾個方法都是靜態的,通常,你可以使用如下兩種模式創建代理對象:
第一種方式更加直接簡便,并且隱藏了代理$Proxy0對象的結構,回調InvocationHandler就是攔截處理的地方。
JDK的動態代理會動態的創建一個$Proxy0的類,這個類繼承了Proxy并且實現了要代理的目標對象的接口,但你不要試圖在JDK中查找這個類,因為它是動態生成的。$Proxy0的結構大致如下所示:
關于回調接口InvocationHandler:
這是因為目標對象的大部分的方法都被代理了,你在invoke()通過代理對象轉換之后的接口調用目標對象的方法,依然是走的代理對象,也就是說當mammal.type()方法被激活時會立即導致invoke()的調用,然后再次調用mammal.type()方法,… …從而使方法調用進入死循環,就像無盡的遞歸調用。
Proxy代理對象的過程如下所示
JDK的動態代理有個缺點,那就是不能對類進行代理,只能對接口進行代理,想象一下我們的Monkey如果沒有實現任何接口,那么將無法使用這種方式進行動態代理(實際上是因為$Proxy0這個類繼承了Proxy,JAVA的繼承不允許出現多個父類)。但準確的說這個問題不應該是缺點,因為良好的系統,每一個類都是應該有一個接口的。
關于如何進行AOP開發中的Java動態代理問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。