約定程式設計Spring AOP 多個切面

2021-10-23 06:29:16 字數 4167 閱讀 3018

上面我們討論了乙個切面的執行,而事實上spring還可以支援多個切面的執行。在組織多個切面的時候,我們需要知道其執行的順序,首先我們建立3個切面類,如下**所示

package cn.hctech2006.boot.bootaop.aspect;

import org.aspectj.lang.annotation.*;

@aspect

public class myaspect1

@before(

"pointcut()"

) public void before(

) @after(

"pointcut()"

) public void after(

) @afterreturning(

"pointcut()"

) public void afterreturning(

)}

package cn.hctech2006.boot.bootaop.aspect;

import org.aspectj.lang.annotation.*;

@aspect

public class myaspect2

@before(

"pointcut()"

) public void before(

) @after(

"pointcut()"

) public void after(

) @afterreturning(

"pointcut()"

) public void afterreturning(

)}

package cn.hctech2006.boot.bootaop.aspect;

import org.aspectj.lang.annotation.*;

@aspect

public class myaspect3

@before(

"pointcut()"

) public void before(

) @after(

"pointcut()"

) public void after(

) @afterreturning(

"pointcut()"

) public void afterreturning(

)}

這樣就存在了三個切面,他們同時攔截userserviceimpl的manyaspect方法,所以我們現在就來實現這個新的方法,**如下:

@override

public void manyaspects(

)

同期,需要改造userservice介面提供manyaspects方法。這個過程比較簡單,這裡就不演示這個過程。接著在usercontroller這個控制器加入新的方法,對於多個切面進行測試,如**清單所示:

"/manytaspects"

) public string manyaspects(

)這樣我們就帶呼叫了userservcieimpl的manyaspect方法,然後配置檔案加入這三個切面的bean

package cn.hctech2006.boot.bootaop;

) //定義切面

@bean(name =

"myaspect"

) public myaspect initmyaspect(

) //定義切面

@bean(name =

"myaspect1"

) public myaspect1 initmyaspect1(

) //定義切面

@bean(name =

"myaspect2"

) public myaspect2 initmyaspect2(

) //定義切面

@bean(name =

"myaspect3"

) public myaspect3 initmyaspect3(

) //啟動切面

public static void main(string[

] args)

}

執行這三個檔案就可以看到tomcat執行的日誌,待到啟動好了之後,在瀏覽器輸入http://localhost:8241/user/manyaspects,,可以在日誌看到

myaspect1 before..

..myaspect2 before..

..myaspect3 before..

..測試多個切面的順序

myaspect3 after..

....

myaspect3 afterreturning..

....

myaspect2 after..

....

myaspect2 afterreturning..

....

myaspect1 after..

....

myaspect1 afterreturning..

....

很多時候開發者需要確定切面的執行順序,來決定那些切面先執行,那些切面後執行。為此,spring提供了乙個註解@order和乙個介面ordered,我們可以使用他們的任意乙個指定切面的順序,下面我們先展示@order,例如,我們指定myaspect3的順序是1,**如下:

@aspect

@order(1)

public class myaspect3

同樣的我們也可以指定myaspect2的順序是2,myaspect1的順序是3,這樣我們再次測試就可以得到下面的日誌:

myaspect3 before..

..myaspect2 before..

..myaspect1 before..

..測試多個切面的順序

myaspect1 after..

....

myaspect1 afterreturning..

....

myaspect2 after..

....

myaspect2 afterreturning..

....

myaspect3 after..

....

myaspect3 afterreturning..

....

我們可以看到,對於前置通知(before)都是按照@order順序從小到大執行的,而對於後置通知和返回通知都是按照order順序從大到小執行,這就是乙個典型的責任鏈模式的順序。同樣的,使用orderd介面也可以指定順序。**如下:

package cn.hctech2006.boot.bootaop.aspect;

import org.aspectj.lang.annotation.*;

import org.springframework.core.ordered;

import org.springframework.core.annotation.order;

@aspect

//@order(1)

public class myaspect3 implements ordered

@pointcut(

"execution(* cn.hctech2006.boot.bootaop.service.impl.userserviceimpl.manyaspects())"

) public void pointcut(

) @before(

"pointcut()"

) public void before(

) @after(

"pointcut()"

) public void after(

) @afterreturning(

"pointcut()"

) public void afterreturning(

)}

其他的同樣類似,不再贅言,同時推薦使用@order註解。

spring AOP 多個切面

切面 日誌 author w7 public class logger 切面 安全框架 author w7 public class security 切面 許可權 author w7 public class privilege public void setaccess string acces...

Spring AOP 程式設計

package com.xcl.common import org.aspectj.lang.proceedingjoinpoint import org.aspectj.lang.annotation.after import org.aspectj.lang.annotation.afterre...

Spring aop 切面程式設計

package cn.annals.demo.proc.aop import org.aspectj.lang.joinpoint import org.aspectj.lang.proceedingjoinpoint import org.aspectj.lang.annotation.after...