SpringAOP获取方法和类上的注解方法

需求:在方法上添加注解,通过aop获取这个方法,对方法进行处理

// 获取注解的方法,推荐 spring 自带的工具类。
// 1)能获取 代理bean 上的真实target 注解。
// 2)能递归 获取 注解的父子,比如 直接用 RequestMapping 就可以获取 PostMapping 的信息 
 @Component
@Aspect
@Slf4j
public class WebLogAspect {
   
 @Pointcut("@within(org.springframework.web.bind.annotation.RestController)||@annotation(com.haier.strategy.resolution.config.log.WebLog)")
    public void customAnnoPc() {
        // 这就是个切面
    }


    @Around(value = "customAnnoPc()")
    public Object doLog(ProceedingJoinPoint pjp) throws Throwable {
        Object o = dealLog(pjp);
        if (o != null) {
            return o;
        }
    }
   public static String dealLog(ProceedingJoinPoint pjp) {
   //类上的注解
        RequestMapping classAnno = AnnotationUtils.findAnnotation(pjp.getTarget().getClass(), RequestMapping.class);
        //方法上的注解
        RequestMapping methodAnno = AnnotatedElementUtils.findMergedAnnotation(getMethod(pjp), RequestMapping.class);
 
        String page = classAnno.name(), service = methodAnno.name();
        return String.format("%s-%s", page, service);
    }
 
    /**
     * 获取方法
     */
    private static Method getMethod(ProceedingJoinPoint pjp) {
        MethodSignature sign = (MethodSignature) pjp.getSignature();
        return sign.getMethod();
    }
    }
  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用Spring AOP可以实现方法执行成功后改变注解的值。首先,需要在Spring配置文件中启用AOP的支持。然后,在目标方法所在的上添加相关的注解,用于标识需要进行切面处理的方法。接下来,创建一个切面,在切面中定义一个环绕通知方法,该方法会在目标方法执行前后进行调用。在该环绕通知方法中,可以通过反射机制获取目标方法上的注解信息,并进行相应的处理。 假设有一个需要改变注解值的目标方法如下: ```java @MyAnnotation("old value") public void myMethod() { // 目标方法的实现逻辑 } ``` 首先,需要创建一个自定义的注解`MyAnnotation`: ```java @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface MyAnnotation { String value() default ""; } ``` 然后,创建一个切面`MyAspect`,并在该中定义一个环绕通知方法`changeAnnotationValue`: ```java @Component @Aspect public class MyAspect { @Around("@annotation(myAnnotation)") public Object changeAnnotationValue(ProceedingJoinPoint joinPoint, MyAnnotation myAnnotation) throws Throwable { // 获取目标方法 MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature(); Method targetMethod = methodSignature.getMethod(); // 获取目标方法上的注解 MyAnnotation annotation = targetMethod.getAnnotation(MyAnnotation.class); // 修改注解值 MyAnnotation modifiedAnnotation = new MyAnnotationImpl(annotation.value() + " modified value"); // 反射机制修改注解值 MutableMethodMetadata mutableMetadata = new MutableMethodMetadata(targetMethod, false); mutableMetadata.addAnnotation(modifiedAnnotation); AnnotationUtils.synthesizeAndMergeAnnotations(modifiedAnnotation, mutableMetadata); // 调用目标方法 Object result = joinPoint.proceed(); return result; } } ``` 最后,在Spring配置文件中进行AOP的配置: ```xml <aop:aspectj-autoproxy /> <context:annotation-config /> <context:component-scan base-package="com.example" /> ``` 这样,当目标方法`myMethod`被调用时,首先会执行切面`MyAspect`中的环绕通知方法`changeAnnotationValue`,在该方法中修改了目标方法上`MyAnnotation`注解的值,然后再执行目标方法,实现了方法执行成功后改变注解的值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值