spring中AspectJ(16)

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;
        }
    }
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章