/** * Can the given advisor apply at all on the given class? * This is an important test as it can be used to optimize * out a advisor for a class. * @param advisor the advisor to check * @param targetClass class we're testing * @return whether the pointcut can apply on any method */ publicstaticbooleancanApply(Advisor advisor, Class<?> targetClass) { return canApply(advisor, targetClass, false); } /** * 给定的advisor是否可以应用于给定的类? * 这是一个重要的测试,因为它可以用来优化类的advisor。 * 这个版本还考虑了introductions(对于IntroductionAwareMethodMatchers)。 * @param advisor advisor检查 * @param targetClass 目标类 * @param hasIntroductions 这个bean的advisor链是否包含任何introductions * @return 切入点是否可以应用于任何方法 */ publicstaticbooleancanApply(Advisor advisor, Class<?> targetClass, boolean hasIntroductions) { //处理IntroductionAdvisor类型的Advisor if (advisor instanceof IntroductionAdvisor) { //获取ClassFilter,调用matches方法 return ((IntroductionAdvisor) advisor).getClassFilter().matches(targetClass); } //处理PointcutAdvisor类型的Advisor elseif (advisor instanceof PointcutAdvisor) { PointcutAdvisorpca= (PointcutAdvisor) advisor; return canApply(pca.getPointcut(), targetClass, hasIntroductions); } else { // 它没有切入点,所以我们假设它适用。 returntrue; } }
/** * 给定的切入点是否可以应用于给定的类? * 这是一个重要的测试,因为它可以用来优化类的切入点。 * @param pc 要检查的静态或动态切入点 * @param targetClass the class to test * @param hasIntroductions 这个bean的advisor链是否包含introductions * @return 切入点是否可以应用于任何方法 */ publicstaticbooleancanApply(Pointcut pc, Class<?> targetClass, boolean hasIntroductions) { Assert.notNull(pc, "Pointcut must not be null"); //使用 ClassFilter 匹配 class if (!pc.getClassFilter().matches(targetClass)) { returnfalse; }