Spring aop(5)---註解
阿新 • • 發佈:2018-12-17
用註解來使用spring aop:
一、導包4+2:
二、準備目標物件
三、準備通知
四、配置進行織入,將通知織入目標物件中
一個公式:
@Aspect = @Pointcut + (@Before | @After | @Around | @AfterReturning |@AfterThrowing)
一個注意:
Around通知必須要注入一個ProceedingJoinPoint型別的引數,因為裡面要放行
ProceedingJoinPoint型別的引數 只能在Around通知所對應的攔截方法中使用,其它的通知不行的!
@Aspect public class MyAdvisor { @Pointcut(value="execution(* cn..Person.run(..) )") public void pc(){//該方法只是給切點註解寄宿和識別,沒有其它功能 } @Before(value="pc()") public void bf(){ System.out.println("before......."); } @Pointcut(value="execution(* cn..Person.*(..) )") public void pc2(){ } @After(value="pc2()") public void af(){ System.out.println("after......."); } @Around(value="pc2()") public Object around(ProceedingJoinPoint p) throws Throwable{ System.out.println("前面攔,資訊:"+p.getKind()+","+p.getSignature().getName()+","+p.getTarget()); Object returnValue = p.proceed(); //放行 System.out.println("後面攔...."); return returnValue; } @AfterReturning(value="pc()") public void afterReturn(){ System.out.println("這是呼叫完成,正常返回(沒有捕捉到異常)以後"); } @AfterThrowing(value="pc2()") public void afterThrowing(){ System.out.println("這是呼叫完成,發現有異常..."); } }
第二版本:
直接宣告一個變數作為切點:private final String CUT= "execution(* cn..Person.run(..) )";
package cn.hncu.aop.annotation; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.AfterThrowing; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; //切面=切點+通知, @Aspect = @Pointcut + (@Before | @After | @Around | @AfterReturning | @AfterThrowing) @Aspect public class MyAdvisor2 { //直接宣告一個變數作為切點 private final String CUT= "execution(* cn..Person.run(..) )"; @Before(value=CUT) public void bf(){ System.out.println("before......."); } @After(value=CUT) public void af(){ System.out.println("after......."); } @Around(value=CUT) public Object around(ProceedingJoinPoint p) throws Throwable{ System.out.println("前面攔,資訊:"+p.getKind()+","+p.getSignature().getName()+","+p.getTarget()); Object returnValue = p.proceed(); //放行 System.out.println("後面攔...."); return returnValue; } }