Spring AOP 實現——使用annotation、pointcut、aspect


1.annotation

  1. 注解@Interface,代表一種標記。常見的注解有@Override,@Deprecated,@SuppressWarnings。以及@Data。
  2. 注解的注解,成為元注解。常見元注解有:@Retention,@Target
  3. Retention有一個屬性RetentionPolicy,包含3個值。
RetentionPolicy.SOURCE 不會保留在class,僅存為源文件。如@Data就是SOURCE
RetentionPolicy.CLASS 保留在class,但不被虛擬機加載。如@Builder
RetentionPolicy.RUNTIME 本文使用RUNTIME
  1. Target有多個枚舉值。ElementType

本文的annotation

package com.tovan.hign.annocuts.aspect.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface DayDayUp {
}

2.pointcut

pointcut有9種寫法。

execute
within
this
target
args
@target
@within
@annotation
@args

本文使用@annotation實現pointcut

package com.tovan.hign.annocuts.aspect;

import org.aspectj.lang.annotation.Pointcut;

public class DayDayUpPointCut {

    @Pointcut("@annotation(com.tovan.hign.annocuts.aspect.annotation.DayDayUp)")
    public void dayDayUp() {

    }
}

3.aspect

使用時獲取方法、參數、操作返回值等

package com.tovan.hign.annocuts.aspect;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Service;

@Aspect
@Slf4j
@Service
public class DayDayUpAspect {

    @Around("com.tovan.hign.annocuts.aspect.DayDayUpPointCut.dayDayUp()")
    public Object enhanceDayDayUp(ProceedingJoinPoint joinPoint) throws Throwable {
        log.info("正在經過切片增強。enhanceDayDayUp");
        // [1] 查看方法
        MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
        log.info("方法 ={}", methodSignature.getMethod().getName());
        // [2] 查看參數名,參數值
        String[] argNames = methodSignature.getParameterNames();
        Object[] args = joinPoint.getArgs();
        for (int i = 0; i < argNames.length; i++) {
            log.info("參數 {} = {}", argNames[i], args[i]);
        }
        // [3] 選擇操作或者不操作,然后進行返回
        return joinPoint.proceed();
    }
}

4.controller

controller調用

package com.tovan.hign.annocuts.web;

import com.tovan.hign.annocuts.aspect.annotation.DayDayUp;
import com.tovan.hign.annocuts.vo.BaseRequest;
import com.tovan.hign.annocuts.vo.BaseResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("aop")
@Slf4j
public class AopController {

    @PostMapping("func")
    @DayDayUp
    public BaseResult funcDayDayUp(@RequestBody BaseRequest baseRequest, @RequestParam String currentTime) {
        log.info("baseRequest={},currentTime={}", baseRequest, currentTime);
        return BaseResult.success("WEB-操作成功。name=" + baseRequest.getName());
    }

}

5.console

控制台輸出

2020-05-21 16:53:25.673  INFO 12120 --- [nio-8080-exec-3] c.t.hign.annocuts.aspect.DayDayUpAspect  : 正在經過切片增強。enhanceDayDayUp
2020-05-21 16:53:25.678  INFO 12120 --- [nio-8080-exec-3] c.t.hign.annocuts.aspect.DayDayUpAspect  : 方法 =funcDayDayUp
2020-05-21 16:53:28.495  INFO 12120 --- [nio-8080-exec-3] c.t.hign.annocuts.aspect.DayDayUpAspect  : 參數 baseRequest = BaseRequest(name=這是參數)
2020-05-21 16:53:28.496  INFO 12120 --- [nio-8080-exec-3] c.t.hign.annocuts.aspect.DayDayUpAspect  : 參數 currentTime = today
2020-05-21 16:53:28.496  INFO 12120 --- [nio-8080-exec-3] c.tovan.hign.annocuts.web.AopController  : baseRequest=BaseRequest(name=這是參數),currentTime=today


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM