aop難點解析。
靜態織入和動態織入的區別?
需求示例:假設有一個包,一個包當中有一個方法,我們想在這個方法的前後,加上環繞。
那麽怎麽加呢?
把知道的都說一遍。
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難點解析。