1. 程式人生 > >aop難點解析。

aop難點解析。

虛擬機 創建 三種 參數 正則 viso 進行 反射 pro

靜態織入和動態織入的區別?

需求示例:假設有一個包,一個包當中有一個方法,我們想在這個方法的前後,加上環繞。

那麽怎麽加呢?

把知道的都說一遍。

1.建立JsonService

2.建立JSONASPECT,這個類是一個Bean,它使用了@Aspect

3.寫XML文件。

3.1靜態織入 (好處就是:編譯的時候織入,無性能壓力)

3.2 動態織入

問:動態織入比靜態織入靈活在哪個地方?

如果是動態織入,那麽是運行時,。。。不曉得怎麽回答。

比如JointPoint(攔截點吧),什麽時候攔截,靠什麽東西攔截,什麽時候可以觸發攔截點,這些攔截點有沒有什麽規律?

Join Point可以是任何點,那麽對應Aop的織入點又是什麽意思呢?

那就要考慮到pointCut了,AOP的pointCut的粒度是方法,對於一個方法,可能有很多的aspect.

還有一個問題是:PointCut的正則表達式怎麽寫?

答:

SPRING動態代理有哪些?cglib和jdk動態代理。

區別:JDK動態代理,需要創建接口,但是cglib不需要。

JDK動態代理:Proxy.newProxyInstance(targetAspectClass);(問:為什麽可以這麽做?)

aop包括靜態織入和動態代理,動態代理又分為jdk代理和cglib代理,

pointcut正則表達式的寫法:

有三種,一種是execution,一種是annonation,一種是within(這種TMD還沒研究過的!!!)

就拿execution來說吧,首先是 * * public ..(..)<---xxxx又忘記鳥。

你能給我演示一下靜態織入嗎?

編譯時織入,利用的是ASPECTJ的特性去織入。

那什麽是動態織入呢?

利用JDK代理,Proxy類裏面的newProxyInstance去進行織入。

這個類必須實現InvocationHandler,然後裏面有一個CreateNewInstance方法,然後這個類裏面還有一個invoke方法,這個裏面又包含了一個invoke方法,裏層的invoke方法,其實是虛擬機去調用的,也就是和JVM有關的,它調用前後就是一個JointPoint process.proceed()方法,調用這個東西,其實就是完成了這個方法,在before和after這個方法的前後,就會記錄日誌。

問:aspect和advisor有什麽區別?不知道!!!!

問個問題,cglib代理和jdk代理的區別。

jdk動態代理的invoke方法什麽時候會被調用?

我總算是弄明白了,原來這和InvokationHanlder接口裏面的實現類的構造函數有關系,構造函數裏面用不僅會初始化父類的構造函數,還會把當前代理類所關聯的類一並註入進去。

在newProxyInstance方法裏面,其實生成的是一個帶有InvocationHanlder功能的一個代理類,你所使用的真實方法當中的INVOKE方法,會在你調用真實方法的時候,轉換成這個INVOKE方法,也就是說你調用了a方法,其實並不是調用的A方法,

而是調用的invoke方法,A方法只是作為一個參數,被傳遞到了INVOKE裏面,真正調用A方法的時候,是在內層的一個.invoke的一個反射方法的時候去調用,這樣就實現了AOP日誌處理。

aop難點解析。