记AOP使用遇到的坑

场景:
在项目中定义了一个注解

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface NeedXXXCheck {
CheckItemEnum[] value();
enum CheckItemEnum {
        CHENCK_XXX_STATUS
        }
       }

使用AOP 定义一个切面,对使用了该注解的方法进行特定的参数校验

@Component
@Aspect
@Slf4j
public class InnerFacadeValidationXXX {
@Around(value = "execution(* com.XXX.facade..*.*(..))")
    public Object checkXXXAround(ProceedingJoinPoint joinPoint) throws Throwable {
        MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
        Method method = methodSignature.getMethod();
        NeedXXXCheck annotation = method.getAnnotation(NeedXXXCheck.class);
  
        if (annotation == null) {
        	
            return joinPoint.proceed();
        }

        Object[] args = joinPoint.getArgs();
        // 进行参数校验
        ...
}

然而在发现在实际方法调用过程中发现,使用@NeedXXXCheck 注解的方法,并没有进行参数校验。
在本地环境中对此进行debug,method.getAnnotation(NeedXXXCheck .class)获取到的annotation 是null,所以就直接进行了目标方法的执行,即进行joinPoint.proceed这个方法。
再继续debug发现,在获取method的时候不对劲了
method在这里插入图片描述

就在spring的配置中

<aop:aspectj-autoproxy proxy-target-class='false'/>

在spring中配置使用了jdk代理,而在项目中注解是使用在接口的实现类上,当AOP获取到切入点是接口,没有取到对应的注解,导致method.getAnnotation获取到的为null
把配置改成

<aop:aspectj-autoproxy proxy-target-class='true'/>

这时使用了cglib代理,便可以成功的获取到对应切入点的注解

CGLIB代理和JDK代理最大的区别就是:CGLIB代理的对象不需要实现任何接口,它使用的字节码子类代理方式,但是JDK代理的对象必须实现接口。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值