使用aop來監控方法進行增強處理

20161201發表於2020-10-10
  1. aop是面向切面程式設計,在不改變其方法的內部邏輯來增強一個方法的執行

      aop的幾種通知:  前置通知、後置通知、異常通知、環繞通知

     使用aop的方法:自定義一個註解類來標記方法,或者是直接監控方法

  下面使用了前置通知和後置通知

  自定義註解             

/**
 * 自定義操作日誌記錄註解
 *
 * @author Ghl
 *
 */
@Target({ ElementType.PARAMETER, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Log {
    /**
     * 模組
     */
    public String title() default "";

    /**
     * 型別操作:比如 0:是對學生的操作 1:是課程和批次操作  ...
     *
     */
    public String flag() default "";

    /**
     * 操作的型別 比如 1:增加 2:修改 3:刪除
     *
     */
     public int openType() default 0;


}

  標記方法

@Log(title="自考訂單關閉操作",openType = 2,flag = "12")
public int closeOrder(String id) {
    return gxOrderMapper.closeOrder(id);
}

   監控標記方法

  /**
     * @param joinPoint 切點 可以獲取到資料引數
     */
    @AfterReturning(pointcut = "logPointCut()")
    public void doAfterReturning(JoinPoint joinPoint) {
        //處理日誌操作的邏輯處理
        handleLog(joinPoint);
    }

JoinPoint 代理了被監控方法中的引數,解析代理物件

          public void getInFo(final JoinPoint joinPoint){
  //獲取Log中的標記
            Log annotationLog = getAnnotationLog(joinPoint);
            //獲取方法引數
            Object[] args = joinPoint.getArgs();}


    /**
     * 是否存在註解,如果存在就獲取
     */
    private Log getAnnotationLog(JoinPoint joinPoint) throws Exception {
        Signature signature = joinPoint.getSignature();
        MethodSignature methodSignature = (MethodSignature) signature;
        Method method = methodSignature.getMethod();

        if (method != null) {
            return method.getAnnotation(Log.class);
        }
        return null;
    }

 前置通知(單獨監控某個方法,刪除操作使用的前置通知)

   //單獨監控刪除批次日誌的資訊
    @Pointcut("execution(* com.gx.manager.biz.impl.GxPeriodBizImpl.deteleGxPeriod(..))")
    public void delGxPeriod(){}
    @Before("delGxPeriod()")
    public void delGxPeriodLog(JoinPoint joinPoint){
    }

 

相關文章