今天在項目中成功實現了spring aop 。spring
@Before @After @AfterReturning @Around @AfterThrowing spa
這五個是實現spring aop經常使用的五個註解code
相關的註解還有@Aspect @Component @PointCut blog
我在實踐中發現:get
1.@Before @After @AfterReturning @Around 這四個通知只有用一種,若是使用兩種及以上會發生一些問題。io
2.@@PointCut 註解的方法不會被執行,只起到了一個把切面表達式抽象出來的做用。class
3.@AfterReturning是最經常使用的:object
使用 JointPoint.getArgs()能夠獲取執行目標方法時傳入的參數。(同@Before @After @Around @AfterThrowing)aop
@AfterReturning註解中的returning = "object"應該和形參的object名字一致 ,用來接收目標方法的返回值。方法
@AfterReturning(pointcut="execution(...) " returning="object") public void afterReturning(JointPoint jp,Object object){
//注意這裏的object 應該和returning="object"保持一致 System.out.println(object); //object是目標方法返回的參數 System.out.println(jp.getArgs() ); //經過這種方法能夠獲取目標方法的傳入參數 }
下面是更具體的內容:
@Aspect @Componet public class myPointCut{ @Before("execution(...) ") public void before(){ System.out.println("前置通知:在目標方法執行前執行" ); } @After("execution(...) ") public void after(){ System.out.println("後置通知:在目標方法執行後執行" ); } @Around("execution(...) ") public void around(){ System.out.println("環繞通知:在目標方法執行先後都執行" ); } @AfterReturning(pointcut="execution(...) " returning="object") public void afterReturning(JointPoint jp,Object object){
//注意這裏的object 應該和returning="object"保持一致 System.out.println(object); //object是目標方法返回的參數 System.out.println(jp.getArgs() ); //經過這種方法能夠獲取目標方法的傳入參數 } @AfterThrowing("execution(...) ") public void afterThrowing(){ System.out.println("異常通知:在目標方法發生異常時執行" ); } }