spring自定義切面執行順序的方法

2021-09-28 23:23:55 字數 3464 閱讀 8582

使用spring框架的時候,用aop需要控制自己寫的切面的順序,例如如下切面**:

@aspect

@order(-

1)//會先掃瞄註解的值,如果註解的值找不到,再找getorder()的值

public

class

aspectjorderlow

implements

ordered

@before

("testpointcut()"

)public

void

beforetest()

@order(-

100)

//同一切點的同一型別通知方法,例如before,這個order註解沒用,根據方法字母序決定執行先後順序

@before

("testpointcut()"

)public

void

beforetest()

@after

("testpointcut()"

)public

void

aftertest()

@around

("testpointcut()"

)public object aroundtest

(proceedingjoinpoint pjp)

throws throwable

@override

public

intgetorder()

}

@aspect

public

class

aspectjorderhigh

implements

ordered

@before

("testpointcut()"

)public

void

beforetest()

@after

("testpointcut()"

)public

void

aftertest()

@around

("testpointcut()"

)public object aroundtest

(proceedingjoinpoint pjp)

throws throwable

@override

public

intgetorder()

}

public

class

testorder

public

void

setteststr

(string teststr)

public

void

test()

public

static

void

main

(string[

] args)

}

testorder.xml

<?xml version="1.0" encoding="utf-8"?>

xmlns

=""xmlns:xsi

=""xmlns:aop

=""xsi:schemalocation

="/spring-beans-3.2.xsd

/spring-aop-3.2.xsd"

>

<

aop:aspectj-autoproxy

/>

class

="com.stpice.spring.demo.aop.order.aspectjorderhigh"

/>

class

="com.stpice.spring.demo.aop.order.aspectjorderlow"

/>

"testorder"

class

="com.stpice.spring.demo.aop.order.testorder"

/>

beans

>

定義了兩個切面類,testorder是切面織入的目標類,testorder.xml是配置檔案。執行後列印出來如下的內容,可以看到高低優先順序不同的切面中的before、after、around切面的執行順序如下。

trigger beforearound in com.stpice.spring.demo.aop.order.aspectjorderhigh

trigger [before] in com.stpice.spring.demo.aop.order.aspectjorderhigh

trigger [beforearound] in com.stpice.spring.demo.aop.order.aspectjorderlow

trigger [before] in com.stpice.spring.demo.aop.order.aspectjorderlow

testorder

trigger [afteraround] in com.stpice.spring.demo.aop.order.aspectjorderlow

trigger [after] in com.stpice.spring.demo.aop.order.aspectjorderlow

trigger afteraround in com.stpice.spring.demo.aop.order.aspectjorderhigh

trigger [after] in com.stpice.spring.demo.aop.order.aspectjorderhigh

因為目前在兩個切面aspectjorderhighaspectjorderlow中覆寫的getorder方法中返回的是0,就是還沒有顯式的指定不同的順序,所以,根據跟蹤原始碼,可以發現在order相同的情況下, 是根據切面類的名稱字母序進行優先順序控制的,字母序越靠前,優先順序越高。字母序的比較,首先將類名轉換為字串,然後呼叫stringcompareto()方法,對兩個類名進行比對,決定切面的排序的。如果切面類使用了@order註解或者是實現了ordered介面,那麼可以在比對的時候自動呼叫getorder()的方法,然後比較返回的值大小,值越小,優先順序越高。同乙個切面類中的方法,如果有多個不同的切入方式,例如@around,@before,@after,@afterreturning,@afterthrowing,那麼會先掃瞄出各個方法上的註解,對不同的方法按照上邊註解的順序進行排序,然後按照字母序進行排序,所以最終呈現出來的,同乙個切面類中的不同切面方法的執行順序,就會呈現如上所示的狀態。

自定義切面例項

需求 日誌插入,比如乙個許可權平台管理,系統希望記錄每一條管理員操作許可權或應用的記錄,如修改許可權,新增許可權,刪除許可權,新增應用,修改應用,刪除應用等,將這些審計記錄存到資料庫,方便追蹤。用面向切面程式設計,自定義切面例項 1.自定義審計註解,用來指定操作型別和操作目標 審計 target r...

springboot aop 自定義切面程式設計

本文結合springboot,實現切面程式設計。before 前置通知 在某連線點 joinpoint 之前執行的通知,但這個通知不能阻止連線點前的執行。after 後通知 當某連線點退出的時候執行的通知 不論是正常返回還是異常退出 afterreturning 返回後通知 在某連線點正常完成後執行...

Jquery ajax執行順序 返回自定義錯誤資訊

1.多個ajax 在乙個function中的執行順序 由於jquery中的ajax的async預設是true 非同步請求 如果想乙個ajax執行完後再執行另乙個ajax,需要把async false就可以了 function testajax alert test ajax error functi...