判断切面是否可以应用到当前类——AopUtils工具类使用

AopUtils工具类canApply的使用

AopUtils是spring自带的工具类,我们可以使用它去判断某个类是否可以应用我们设计的切面advisor

1、canApply方法源代码如下

 public static boolean canApply(Advisor advisor, Class<?> targetClass) {
        return canApply(advisor, targetClass, false);
    }
    public static boolean canApply(Advisor advisor, Class<?> targetClass, boolean hasIntroductions) {
        if (advisor instanceof IntroductionAdvisor) {
            return ((IntroductionAdvisor)advisor).getClassFilter().matches(targetClass);
        } else if (advisor instanceof PointcutAdvisor) {
            PointcutAdvisor pca = (PointcutAdvisor)advisor;
            //本次关注此类切面判断
            return canApply(pca.getPointcut(), targetClass, hasIntroductions);
        } else {
            return true;
        }
    }

本文我们关注下PointcutAdvisor类型的切面

2、PointcutAdvisor 类型切面的判断

我们以AnnotationMatchingPointcut切面为例,跟踪代码流程,只要关注下面红框的代码就行,两个自定义注解是简单的,没啥意义
在这里插入图片描述

  • 2.1、进入构造方法
    在这里插入图片描述
    在这里插入图片描述
    我们看下ClassFilter.TRUE是个啥
    在这里插入图片描述
    在这里插入图片描述
    是个TrueClassFilter实例,它的matches方法永远返回true

  • 2.2、创建类注解过滤器
    在这里插入图片描述
    看下AnnotationClassFilter,默认创建对象时不检查继承关系的类(不检查父类)
    在这里插入图片描述
    AnnotationClassFilter的matches方法会调用这个clazz.isAnnotationPresent(this.annotationType)方法进行判断是否存在注解类型

3、canApply

在这里插入图片描述
类过滤器校验后进行方法匹配器流程
在这里插入图片描述

反射获取所有方法
在这里插入图片描述
这里如果方法匹配器是introductionAwareMethodMatcher类型的,则调用introductionAwareMethodMatcher的matches方法

本次测试是调用AnnotationMethodMatcher的matches方法
在这里插入图片描述
执行结果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值