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方法
执行结果