2016/1/18 11:44:08
1.AspectJ
- @AspectJ的風格類似純Java註解的普通Java類
- Spring可以使用AspectJ來做切入點解析
- AOP的運行時仍舊是純的Spring AOP,對AspectJ的編譯器或者織入無依賴性
- @AspectJ切面使用@Aspect註解配置,擁有@Aspect的任何bean將被Spring自動識別註冊並應用
- 用@Aspect註解的類可以有方法和字段,它們也可能包括切入點(pointcut),通知(advice),和引入(Introduction)聲明
- Aspect註解是不能通過類路徑自動檢測發現的,所以需要配合使用@Component註釋或者在xml配置bean
- 一個類中的@Aspect註解標識它爲一個切面,並且將自己從自動代理中排除
2.切入點的定義
- 一個切入點可以通過一個普通的方法定義來提供,並且切入點表達式使用@Pointcut註解,方法返回類型必須爲void
- 環繞通知使用@Around註解來聲明,通知方法的第一個參數必須是ProceedingJoinPoint類型
在通知內部調用ProceedingJoinPoint的proceed()方法會導致執行真正的方法,傳入一個Object[]對象,數組中的值將被做爲參數傳遞給方法
@Aspect public class AspectClass { // 配置前置通知 @Before("execution(* com.lovo.inter..*.t*(..))") public void beforeMethod() { System.out.println("執行beforeMethod方法"); } // 配置後置通知 @After("execution(* com.lovo.inter..*.t*(..))") public void afterMethod() { System.out.println("執行after方法"); } // 配置環繞通知 @Around("execution(* com.lovo.inter..*.g*(..))") public Object press(ProceedingJoinPoint point) { System.out.println("環繞執行前"); Object returnObj = null; try { returnObj = point.proceed(); } catch (Throwable e) { e.printStackTrace(); } System.out.println("環繞執行後"); return returnObj; } }