AOP获取切点表达式中注解的属性

文章目录

  • 1、获取@Cacheable注解的属性
  • 2、获取自定义注解的属性

1、获取@Cacheable注解的属性

有个小需求,要在日志中打印支持redis缓存的方法的相关信息,这里切点表达式动词用@annotation,后面跟Cacheable注解

@Component
@Aspect
@Slf4j
public class RedisAdvice {

    @Pointcut("@annotation(org.springframework.cache.annotation.Cacheable)")
    public void redisCut(){

    }
    

    //Cacheable redisInfo,
    //redisInfo随便起的,但必须和下面doAround方法中的形参名一样
    @Around("redisCut() &&@annotation(redisInfo)")
    public Object doAround(ProceedingJoinPoint proceedingJoinPoint,Cacheable redisInfo) throws Throwable {
        //获取属性
        StringBuilder redisKey = new StringBuilder(redisInfo.key()).append("::").append(redisInfo.value()[0]);
        MethodSignature signature = (MethodSignature) proceedingJoinPoint.getSignature();
        String methodName = signature.getName();
        log.info("RdisInfo: key: {} ,methodName: {}",redisKey,methodName);
        Object ret = proceedingJoinPoint.proceed();
        return ret;
	}

}

2、获取自定义注解的属性

自己定义个注解来搭配AOP获取一下,注解有三个属性,value,description和title

主要是为了某些切点有时候不能统一表达,那就可以直接自定义个注解,然后统一标记一下,也算是个实现思路吧。

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

    String value();

    String description() default "this is my annotation!";

    String title() default "";
}

在service层中的方法上使用这个自定义注解

@Service
public class MyService {

    @MyAnnotation("this is a value")
    public void methodOne(){
        System.out.println("MyService类中的methodOne方法");
    }

    @MyAnnotation(value = "methodTwo value",description = "MyService.method",title = "aop")
    public void methodTwo(){
        System.out.println("MyService类中的methodTwo方法");
    }
}

切面通知类里获取注解属性

@Component
@Aspect
public class CutAdvice {


    @Pointcut("@annotation(cn.itcast.user.annotation.MyAnnotation)")
    public void pointCut(){

    }

    @Before("pointCut() && @annotation(param)")
    public void beforeSome(MyAnnotation param){
        System.out.println("aop + annotation value: " + param.value());
        System.out.println("aop + annotation description: " + param.description());
        System.out.println("aop + annotation title: " +  param.title());
    }
}

写个测试接口:

@RestController
@RequestMapping("/aop")
public class MyController {

    @Autowired
    MyService myService;

    @GetMapping("/annotation")
    public void myAnnotation(){
        myService.methodTwo();
        myService.methodOne();
    }
}

效果:

AOP获取切点表达式中注解的属性_第1张图片

总结:

AOP获取切点表达式中注解的属性_第2张图片

你可能感兴趣的:(JavaDev,AOP,注解,Spring)