摘要:前言用過做過開發(fā)的同學多少都對的有所了解和使用的經(jīng)驗也都知道有等至于的基本概念我想大家也都清楚這里也就不再贅述今天在論壇里看到了一個問題談到了的執(zhí)行順序的問題看到問題以后突然發(fā)現(xiàn)自己對這方面的理解也不是十分的深入在回答問題的同時正好對這個知
前言
用過Spring做過開發(fā)的同學,多少都對Spring的AOP有所了解和使用的經(jīng)驗.也都知道有@Around,@Before,@After等Advice.至于Spring AOP的基本概念,我想大家也都清楚,這里也就不再贅述.
今天在論壇里看到了一個問題,談到了Spring AOP的Advice執(zhí)行順序的問題,看到問題以后,突然發(fā)現(xiàn)自己對這方面的理解也不是十分的深入.在回答問題的同時,正好對這個知識點深入的了解一下.
本文基于Spring AspectJ AOP的方式來進行描述.
Spring官方對Advice執(zhí)行順序的解釋參考文檔:aop-ataspectj-advice-ordering
When two pieces of advice defined in different aspects both need to run at the same join point, unless you specify otherwise the order of execution is undefined. You can control the order of execution by specifying precedence. This is done in the normal Spring way by either implementing the org.springframework.core.Ordered interface in the aspect class or annotating it with the Order annotation. Given two aspects, the aspect returning the lower value from Ordered.getValue() (or the annotation value) has the higher precedence.
上面的內(nèi)容簡單的說就是,當對于同一個Join Point有兩個Advice定義在不同的Aspect中的時候,他們的執(zhí)行順序是根據(jù)Aspect類的@Order注解的值,或者通過實現(xiàn)Order并重寫getValue方法的值來決定的.同時,Order的值越小,優(yōu)先級越高.
When two pieces of advice defined in the same aspect both need to run at the same join point, the ordering is undefined
當同一個Aspect中對同一個Join Point有兩個Advice的話,這兩個Advice的順序是不固定的.
實例首先我們建立一個Spring的工程,然后基于spring-test進行下面的操作.本文的spring版本是:4.3.11.RELEASE
1. 建立一個AuthAnnotation注解類,該注解作用在方法上即可
2. 在spring的配置中添加aspect aop支持
3. 編寫Aspect的Advice,請注意圖一紅框的方法名
4. 編寫一個Service,符合上面的切入點規(guī)則即可
5. 執(zhí)行單元測試,調(diào)用TestService.test()方法,輸出結果如下
----Order1:checkAuth:Annotation---- ----Order1:checkAuthPackage:Execution---- ----Order2:checkAuthPackage:Execution---- ---Service:Test---
ReflectiveAspectJAdvisorFactory多次運行以后,我們會發(fā)現(xiàn)一個問題,就是Order1的checkAuth方法一直是第一個執(zhí)行.這是不是說明,以注解方式的PointCut是不是會有首先執(zhí)行的優(yōu)先級?
如果是的話,這就不符合上面Spring官方文檔的說法了.來讓我們看看為什么?
該類的作用是基于AspectJ時,創(chuàng)建Spring AOP的Advice.
static { CompoundComparatorcomparator = new CompoundComparator (); comparator.addComparator(new ConvertingComparator ( new InstanceComparator ( Around.class, Before.class, After.class, AfterReturning.class, AfterThrowing.class), new Converter () { @Override public Annotation convert(Method method) { AspectJAnnotation> annotation = AbstractAspectJAdvisorFactory.findAspectJAnnotationOnMethod(method); return (annotation != null ? annotation.getAnnotation() : null); } })); comparator.addComparator(new ConvertingComparator ( new Converter () { @Override public String convert(Method method) { return method.getName(); } })); METHOD_COMPARATOR = comparator; }
從該類的靜態(tài)方法塊中我們可以看到,Advice列表的添加順序是按照Around/Before/After/AfterReturning/AfterThrowing的順序,同時根據(jù)Advice的方法名順序進行排序的.
最后的測試當調(diào)用到getAdvisors方法的時候,會調(diào)用getAdvisorMethods方法,來獲取所有的advice Method對象.同時根據(jù)METHOD_COMPARATOR的規(guī)則進行排序.
我們修改OrderOneAspect這個類中,checkAuthPackage方法的名字為aCheckAuthPackage,在執(zhí)行一次單元測試的結果如下:
----Order1:checkAuthPackage:Execution---- ----Order1:checkAuth:Annotation---- ----Order2:checkAuthPackage:Execution---- ---Service:Test---
輸出的結果中,我們可以看到,優(yōu)先執(zhí)行的不再是注解方式的PonitCut.由此可見,當同一個Aspect中對同一個Join Point有兩個Advice的話,執(zhí)行的順序與方法的名稱有關.
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://m.hztianpu.com/yun/70490.html
摘要:下例表示方法入?yún)榈姆椒ㄆヅ湓撉悬c,并將和兩個參數(shù)綁定到切面方法的入?yún)⒅薪壎ù韺ο笫褂没蚩梢越壎ū淮韺ο蟮膶嵗? 1. 術語 連接點(JointPoint):代碼中具有邊界性質(zhì)特定點;Spring僅支持方法的連接點,包含方法和方位兩方面信息 切點(Pointcut):定位到某個方法 增強(Advice):織入到目標連接點上的代碼 目標對象(Target):增強邏輯的目標織入類 引...
摘要:入門篇學習總結時間年月日星期三說明本文部分內(nèi)容均來自慕課網(wǎng)。主要的功能是日志記錄,性能統(tǒng)計,安全控制,事務處理,異常處理等等。 《Spring入門篇》學習總結 時間:2017年1月18日星期三說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com教學示例源碼:https://github.com/zccodere/s...個人學習源碼:https://git...
摘要:具體的動態(tài)代理運行原理這里暫不展開,網(wǎng)上有很多相關的內(nèi)容,比如這篇翻譯過來就是面向方面切面編程。所以切面可以理解為和的集合。 1.靜態(tài)代理 在提及動態(tài)代理前先說明一下靜態(tài)代理模式,靜態(tài)代理模式是一種很常見的通用設計模式,實現(xiàn)也很簡單,uml類圖如下: showImg(https://segmentfault.com/img/bVba3gn?w=737&h=312); 如上圖所示,代理類...
摘要:基本知識其實接觸了這么久的我感覺給人難以理解的一個關鍵點是它的概念比較多而且坑爹的是這些概念經(jīng)過了中文翻譯后變得面目全非相同的一個術語在不同的翻譯下含義總有著各種莫名其妙的差別鑒于此我在本章的開頭著重為為大家介紹一個的各項術語的基本含義為了 基本知識 其實, 接觸了這么久的 AOP, 我感覺, AOP 給人難以理解的一個關鍵點是它的概念比較多, 而且坑爹的是, 這些概念經(jīng)過了中文翻譯后...
摘要:一以及術語是的簡稱,被譯為面向切面編程。切面由切點和增強組成,他包括了連接點定義和橫切邏輯代碼的定義,就是負責實施切面的框架。五使用來定義純粹的切面使用方法也非常簡單,使用的標簽。采用動態(tài)代理和動態(tài)代理技術在運行期間織入。 引言 AOP是軟件開發(fā)思想發(fā)展到一定階段的產(chǎn)物,AOP的出現(xiàn)并不是為了代替OOP,僅作為OOP的有益補充,在下面的例子中這個概念將會得到印證。AOP的應用場合是受限...
閱讀 3358·2021-09-23 11:55
閱讀 2818·2021-09-13 10:33
閱讀 1735·2019-08-30 15:54
閱讀 3162·2019-08-30 15:54
閱讀 2429·2019-08-30 10:59
閱讀 2433·2019-08-29 17:08
閱讀 1866·2019-08-29 13:16
閱讀 3647·2019-08-26 12:25