一.Advisor
Advisor
包含AOP通知advice的基本接口(在连接点joinpoint采取的操作),和一个确定通知advice的适用性的过滤器(例如一个切入点pointcut)。换种说法就是:通过切点pointcut过滤出哪些joinpoint需要被拦截,然后对被拦截方法执行增强的逻辑,也就是advice。
Advisor有两个子接口PointcutAdvisor和IntroductionAdvisor。
IntroductionAdvisor
是对类的增强,在原有的功能上增加一些其他接口定义的方法。引入(Introduction)通常是mixins ,可以构建复合对象,从而实现 Java 中多重继承的许多目标。这里不做过多说明。
PointcutAdvisor
由切入点驱动的所有Advisor的超级接口。这几乎涵盖了除introduction advisors以外的所有Advisor。PointcutAdvisor中包含了一个Pointcut成员变量,也就是切点,在加上Advisor接口中的Advice,就形成了一个完整的切面。
PointcutAdvisor子接口或子类
- StaticMethodMatcherPointcutAdvisor:Advisors的便利基类,也是静态切入点(该类继承了StaticMethodMatcherPointcut),如果 Advice 和 subclass 是可序列化的。,默认情况下匹配所有的的目标类。(shiro权限设计就是通过继承该类实现的。AuthorizationAttributeSourceAdvisor extends StaticMethodMatcherPointcutAdvisor )。静态切入点只限于给定的方法和目标类,而不考虑方法的参数。Spring在调用静态切入点时只在第一次调用的时候计算静态切入点的位置,然后缓存起来。所谓静态就是与运行时无关。所以StaticMethodMatcherPointcut中的MethodMatcher的matches(Method method, Class<?> targetClass, Object… args)三个参数的方法抛出异常。
- InstantiationModelAwarePointcutAdvisor:该接口有唯一实现类InstantiationModelAwarePointcutAdvisorImpl。该实现类是AspectJPointcutAdvisor 的内部实现。请注意,每个目标方法都会有一个此Advisor程序的实例。该类就是我们通常在项目中通过aspectj注解实现的切面被包装后的Advisor。
-AspectJPointcutAdvisor:AspectJ相关的。 - AbstractPointcutAdvisor:PointcutAdvisor实现的抽象基类,可以为返回特定切入点/通知或可自由配置的切入点/通知的子类
pointcut
切入点(Pointcut)是连接点(joinpoint)位置的集合,指明触发通知(Advice)的条件.切入点由ClassFilter和MethodMatcher组成。
ClassFilter
限制切入点class匹配,也就是对class进行过滤
MethodMatcher
检查目标方法是否有资格获得advice,即使对method的过滤。
MethodMatcher 可以静态评估或在运行时(动态)评估。静态匹配涉及方法和(可能)方法属性。动态匹配还使特定调用的参数可用,并且运行先前建议的任何效果都适用于连接点。
如果isRuntime()方法返回false ,则可以静态执行评估,并且对于此方法的所有调用,无论其参数如何,结果都是相同的。这意味着如果isRuntime()方法返回false ,则永远不会调用 3个参数 matches方法。
如果实现从其 2个参数matches方法返回true并且其isRuntime()方法返回true ,则 3个参数 matches方法将在每个潜在相关的advice的执行之前立即调用,以决定advice是否应该运行。所有先前的advice,例如拦截器链中的早期拦截器,都将运行,因此它们在参数或 ThreadLocal 状态中产生的任何状态更改都将在评估时可用。
简单来说就是进行匹配时先用两个参数的matches()方法进行匹配,若匹配成功,则检查boolean isRuntime()的返回值,若为true,则调用三个参数的matches()方法进行匹配。