1. 程式人生 > >Java AOP實現和應用

Java AOP實現和應用

Java中常使用到AOP功能,實現AOP分三步:

1,定義一個切面類,類前加@component註解,使該類注入spring的IOC容器中,使之受spring管理,同時類前加@Aspect註解,使該類成為切面類,定義了是什麼,即解決What的問題

2,在切面類中的實現了某些功能的各個方法前加上如下相應註解,定義切入的時間點,解決When的問題
@Before(value="該方法作用的目標表達式"),前置通知,例如;

@Before(value="myPonitcut01()")
public void beforeExecute(JoinPoint joinPoint){
//...方法執行前的處理...
}

@AfterReturning(value="該方法作用的目標表達式",returning="result"),返回值通知,其中result要與方法中對應引數名一樣,例如;

@AfterReturning(value="myPonitcut01()", returning="result")
public void afterExecute(JoinPoint joinPoint, Object result){
//...方法返回值時的處理...
}

@After(value="該方法作用的目標表達式"),後置通知,例如;

@After(value="myPonitcut01()")
public void afterExecute(JoinPoint joinPoint) throws Throwable{
//...方法執行後的處理...
}

@AfterThrowing(value="該方法作用的目標表達式",throwing="e"),異常通知,其中 e 要與方法中對應引數名一樣,例如;

@AfterThrowing(pointcut = "myPonitcut01()", throwing="e") 
public void afterThrowing(JoinPoint joinPoint, Throwable e){
//...方法執行報異常時的處理...
}

@Around(value="該方法作用的目標表達式"), 環繞通知,注意這裡的方法引數是 ProceedingJoinPoint,例如:

@Around(value="myPonitcut01()")
public void aroundExecute(ProceedingJoinPoint joinPoint) throws Throwable{
//...方法執行前後的處理...
}

上面各個註解的value值如果有多個表示式可用 與&& 或||  非!進行相應連線,即跟平時寫的Java程式碼的與或非一樣,例如;

@Before(value="myPonitcut01() || myPonitcut02()")
public void beforeExecute(JoinPoint joinPoint){
//...方法執行前的處理...
}

3,定義方法作用的目標表達式,解決在哪裡應用切面類方法的問題,即解決了Where的問題,一般為:
execution(* com.xxx.yyy.kkk.*.*(..)),或者 //任意返回型別,不指定方法修飾符,如public方法
execution(public * com.xxx.yyy.kkk.*.*(..)),//任意返回型別,指定方法修飾符僅public方法
也可以在切面類的定義某個返回void的方法(如:myPonitcut01())前加註解
@Pointcut(value="切入點作用的目標表達式"),或者
@Pointcut(value="@annotation(com.aa.bb.cc.某個已有或自定義的註解類")
然後在AOP的第2步中的各個註解的value中使用該方法,例如@Before(value="myPonitcut()"),目的是取得切入點作用的目標表達式;

歡迎拍磚討論...