国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

基于AspectJ的Spring AOP Advice執行順序

xinhaip / 3214人閱讀

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

前言

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

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

本文基于Spring AspectJ AOP的方式來進行描述.

Spring官方對Advice執行順序的解釋

參考文檔: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.

上面的內容簡單的說就是,當對于同一個Join Point有兩個Advice定義在不同的Aspect中的時候,他們的執行順序是根據Aspect類的@Order注解的值,或者通過實現Order并重寫getValue方法的值來決定的.同時,Order的值越小,優先級越高.

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,符合上面的切入點規則即可

5. 執行單元測試,調用TestService.test()方法,輸出結果如下

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

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

ReflectiveAspectJAdvisorFactory

該類的作用是基于AspectJ時,創建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;
    }

從該類的靜態方法塊中我們可以看到,Advice列表的添加順序是按照Around/Before/After/AfterReturning/AfterThrowing的順序,同時根據Advice的方法名順序進行排序的.

當調用到getAdvisors方法的時候,會調用getAdvisorMethods方法,來獲取所有的advice Method對象.同時根據METHOD_COMPARATOR的規則進行排序.

最后的測試

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

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

輸出的結果中,我們可以看到,優先執行的不再是注解方式的PonitCut.由此可見,當同一個Aspect中對同一個Join Point有兩個Advice的話,執行的順序與方法的名稱有關.

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/70490.html

相關文章

  • Learn Spring - Spring AOP

    摘要:下例表示方法入參為的方法匹配該切點,并將和兩個參數綁定到切面方法的入參中綁定代理對象使用或可以綁定被代理對象的實例。 1. 術語 連接點(JointPoint):代碼中具有邊界性質特定點;Spring僅支持方法的連接點,包含方法和方位兩方面信息 切點(Pointcut):定位到某個方法 增強(Advice):織入到目標連接點上的代碼 目標對象(Target):增強邏輯的目標織入類 引...

    kgbook 評論0 收藏0
  • 慕課網_《Spring入門篇》學習總結

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

    Ververica 評論0 收藏0
  • 從動態代理到SpringAop以及AspectJ風格

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

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

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

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

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

    CodeSheep 評論0 收藏0

發表評論

0條評論

xinhaip

|高級講師

TA的文章

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