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