2012-01-11 161 views
7

我有兩個註解春天註釋建議爲了

@One 
@Two 
public Object foo() { ... } 

的方法我有使用這些批註

@Around("@annotation(One)") 
public Object doOne(final ProceedingJoinPoint joinPoint) throws Throwable { ... } 

@Around("@annotation(Two)") 
public Object doTwo(final ProceedingJoinPoint joinPoint) throws Throwable { ... } 

兩個方面不過是其中的順序這些建議是不確定的?

回答

6

的順序是不確定的。如果您需要確定的訂單,請使用@Order註釋。

參見:

+0

事實證明,我的一個方面是@Transactional,所以我不能在此設置按順序。 – 2012-01-11 11:30:03

+2

@Paul:可以通過''的屬性設置'@ Transactional'的順序。 – axtavt 2012-01-11 11:52:10

+0

只是想添加這個,因爲我正在尋找如何在XML中做到這一點,並找不到任何東西,反正看起來你指定的命令在XML中的命令是它執行的順序。我已經測試了幾次,如果有人可以證實這會很棒。 – 2013-10-09 23:16:01

1

順序是不確定的,除非明確指出(例如,通過使用@Order

3

6.2.4.7。諮詢訂購

當有多個通知都希望能在同一 連接點運行會發生什麼? Spring AOP遵循與AspectJ相同的優先規則來確定建議執行的順序。最高優先級 通知會先執行「關於在路上」(所以給定的 兩塊意見前,一個具有最高優先級首先運行)。 「在連接點上的出路」中,最高優先級通知最後運行 (因此,如果給出兩條通知後,最高優先級的通知將運行第二條)。

當兩點建議在不同的方面都需要在同一 運行定義的連接點,除非另行指定 執行的順序是不確定的。您可以通過 指定優先級來控制執行順序。這可以通過 實現 方面類中的org.springframework.core.Ordered接口或使用Order批註對其進行註釋來以普通的Spring方式完成。給定兩個 方面,從Ordered.getValue() (或註釋值)返回較低值的方面具有較高的優先級。

當兩點建議在同一方面都定義需要同時運行 連接點,順序是不確定的(因爲沒有檢索通過反射的聲明順序爲 的javac編譯的類 方式) 。考慮將這種通知方法摺疊爲每個方面類別中每個連接點的一種建議方法,或者將這些建議重構爲單獨的方面類別 - 可以在方面級別上訂購 。

http://static.springsource.org/spring/docs/2.0.x/reference/aop.html

0
  1. 在路上,在一個連接點,以最低階值 建議最先被執行。

  2. 在從連接點出來的路上,具有最高Order值的建議 首先被執行。

  3. 當建議的兩片在相同的方面都需要限定於在同一連接點運行,排序是undefined.Consider塌陷這些通知方法到一個通知方法在每個切面類連接點,或重構片的建議分成不同的方面 - 可以在方面一級訂購。
+2

我以前曾經警告過你在不透露它是你的網站的情況下包含你自己網站的鏈接。此外,您的鏈接在11月18日作爲用戶「Maverick」發佈之前已被刪除。您的答案似乎至少在某種程度上有用,因此,第二次,我將從您的答案中刪除該鏈接,以免它錯誤作爲垃圾郵件。但是,我不會繼續這樣做。在某些時候,如果您繼續像這樣鏈接到您的網站,您的帖子只會被標記爲垃圾郵件並被刪除。 – 2012-11-27 20:58:25