成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

基于AspectJ的Spring AOP Advice執(zhí)行順序

xinhaip / 3225人閱讀

摘要:前言用過做過開發(fā)的同學(xué)多少都對的有所了解和使用的經(jīng)驗(yàn)也都知道有等至于的基本概念我想大家也都清楚這里也就不再贅述今天在論壇里看到了一個問題談到了的執(zhí)行順序的問題看到問題以后突然發(fā)現(xiàn)自己對這方面的理解也不是十分的深入在回答問題的同時正好對這個知

前言

用過Spring做過開發(fā)的同學(xué),多少都對Spring的AOP有所了解和使用的經(jīng)驗(yàn).也都知道有@Around,@Before,@After等Advice.至于Spring AOP的基本概念,我想大家也都清楚,這里也就不再贅述.

今天在論壇里看到了一個問題,談到了Spring AOP的Advice執(zhí)行順序的問題,看到問題以后,突然發(fā)現(xiàn)自己對這方面的理解也不是十分的深入.在回答問題的同時,正好對這個知識點(diǎn)深入的了解一下.

本文基于Spring AspectJ AOP的方式來進(jìn)行描述.

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)容簡單的說就是,當(dāng)對于同一個Join Point有兩個Advice定義在不同的Aspect中的時候,他們的執(zhí)行順序是根據(jù)Aspect類的@Order注解的值,或者通過實(shí)現(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

當(dāng)同一個Aspect中對同一個Join Point有兩個Advice的話,這兩個Advice的順序是不固定的.

實(shí)例

首先我們建立一個Spring的工程,然后基于spring-test進(jìn)行下面的操作.本文的spring版本是:4.3.11.RELEASE

1. 建立一個AuthAnnotation注解類,該注解作用在方法上即可

2. 在spring的配置中添加aspect aop支持

3. 編寫Aspect的Advice,請注意圖一紅框的方法名


4. 編寫一個Service,符合上面的切入點(diǎn)規(guī)則即可

5. 執(zhí)行單元測試,調(diào)用TestService.test()方法,輸出結(jié)果如下

----Order1:checkAuth:Annotation----
----Order1:checkAuthPackage:Execution----
----Order2:checkAuthPackage:Execution----
---Service:Test---

多次運(yùn)行以后,我們會發(fā)現(xiàn)一個問題,就是Order1的checkAuth方法一直是第一個執(zhí)行.這是不是說明,以注解方式的PointCut是不是會有首先執(zhí)行的優(yōu)先級?
如果是的話,這就不符合上面Spring官方文檔的說法了.來讓我們看看為什么?

ReflectiveAspectJAdvisorFactory

該類的作用是基于AspectJ時,創(chuàng)建Spring AOP的Advice.

static {
        CompoundComparator comparator = 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的方法名順序進(jìn)行排序的.

當(dāng)調(diào)用到getAdvisors方法的時候,會調(diào)用getAdvisorMethods方法,來獲取所有的advice Method對象.同時根據(jù)METHOD_COMPARATOR的規(guī)則進(jìn)行排序.

最后的測試

我們修改OrderOneAspect這個類中,checkAuthPackage方法的名字為aCheckAuthPackage,在執(zhí)行一次單元測試的結(jié)果如下:

----Order1:checkAuthPackage:Execution----
----Order1:checkAuth:Annotation----
----Order2:checkAuthPackage:Execution----
---Service:Test---

輸出的結(jié)果中,我們可以看到,優(yōu)先執(zhí)行的不再是注解方式的PonitCut.由此可見,當(dāng)同一個Aspect中對同一個Join Point有兩個Advice的話,執(zhí)行的順序與方法的名稱有關(guān).

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/70490.html

相關(guān)文章

  • Learn Spring - Spring AOP

    摘要:下例表示方法入?yún)榈姆椒ㄆヅ湓撉悬c(diǎn),并將和兩個參數(shù)綁定到切面方法的入?yún)⒅薪壎ù韺ο笫褂没蚩梢越壎ū淮韺ο蟮膶?shí)例。 1. 術(shù)語 連接點(diǎn)(JointPoint):代碼中具有邊界性質(zhì)特定點(diǎn);Spring僅支持方法的連接點(diǎn),包含方法和方位兩方面信息 切點(diǎn)(Pointcut):定位到某個方法 增強(qiáng)(Advice):織入到目標(biāo)連接點(diǎn)上的代碼 目標(biāo)對象(Target):增強(qiáng)邏輯的目標(biāo)織入類 引...

    kgbook 評論0 收藏0
  • 慕課網(wǎng)_《Spring入門篇》學(xué)習(xí)總結(jié)

    摘要:入門篇學(xué)習(xí)總結(jié)時間年月日星期三說明本文部分內(nèi)容均來自慕課網(wǎng)。主要的功能是日志記錄,性能統(tǒng)計(jì),安全控制,事務(wù)處理,異常處理等等。 《Spring入門篇》學(xué)習(xí)總結(jié) 時間:2017年1月18日星期三說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com教學(xué)示例源碼:https://github.com/zccodere/s...個人學(xué)習(xí)源碼:https://git...

    Ververica 評論0 收藏0
  • 從動態(tài)代理到SpringAop以及AspectJ風(fēng)格

    摘要:具體的動態(tài)代理運(yùn)行原理這里暫不展開,網(wǎng)上有很多相關(guān)的內(nèi)容,比如這篇翻譯過來就是面向方面切面編程。所以切面可以理解為和的集合。 1.靜態(tài)代理 在提及動態(tài)代理前先說明一下靜態(tài)代理模式,靜態(tài)代理模式是一種很常見的通用設(shè)計(jì)模式,實(shí)現(xiàn)也很簡單,uml類圖如下: showImg(https://segmentfault.com/img/bVba3gn?w=737&h=312); 如上圖所示,代理類...

    msup 評論0 收藏0
  • 徹底征服 Spring AOP 之 理論篇

    摘要:基本知識其實(shí)接觸了這么久的我感覺給人難以理解的一個關(guān)鍵點(diǎn)是它的概念比較多而且坑爹的是這些概念經(jīng)過了中文翻譯后變得面目全非相同的一個術(shù)語在不同的翻譯下含義總有著各種莫名其妙的差別鑒于此我在本章的開頭著重為為大家介紹一個的各項(xiàng)術(shù)語的基本含義為了 基本知識 其實(shí), 接觸了這么久的 AOP, 我感覺, AOP 給人難以理解的一個關(guān)鍵點(diǎn)是它的概念比較多, 而且坑爹的是, 這些概念經(jīng)過了中文翻譯后...

    Kylin_Mountain 評論0 收藏0
  • Spring AOP 入門

    摘要:一以及術(shù)語是的簡稱,被譯為面向切面編程。切面由切點(diǎn)和增強(qiáng)組成,他包括了連接點(diǎn)定義和橫切邏輯代碼的定義,就是負(fù)責(zé)實(shí)施切面的框架。五使用來定義純粹的切面使用方法也非常簡單,使用的標(biāo)簽。采用動態(tài)代理和動態(tài)代理技術(shù)在運(yùn)行期間織入。 引言 AOP是軟件開發(fā)思想發(fā)展到一定階段的產(chǎn)物,AOP的出現(xiàn)并不是為了代替OOP,僅作為OOP的有益補(bǔ)充,在下面的例子中這個概念將會得到印證。AOP的應(yīng)用場合是受限...

    CodeSheep 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<