spring 学习笔记 pointcut&advisor

来源:互联网 发布:人工智能 演讲 编辑:程序博客网 时间:2024/05/24 22:44

在spring中定义切入点

如果不能表达在应用系统的什么地方应用 通知的话,通知将毫无用处,这就是切入点的用处。切入点决定了一个特定的类的特定方法是否满足一定的规则。若符合,通知就应用到该方法上。

//Piontcut:切入点:切入点根据方法和类决定何处织入通知。public interface Pointcut {ClassFilter getClassFilter();//类过滤器MethodMatcher getMethodMatcher();//方法匹配器Pointcut TRUE = TruePointcut.INSTANCE;}/*类过滤器ClassFilter接口实现该接口的类决定了以参数传递进来的类是否应该被通知。实现该接口的类一般根据类名决定,但不一定必须如此。该接口总是包含了一个简单的ClassFilter接口实现-ClassFilter.TRUTE。它是规范的适合任何  类的ClassFilter实例,适合用于只根据方法决定时候符合要求的切入。ClassFilter通过类过滤切面。*/public interface ClassFilter {boolean matches(Class<?> clazz);ClassFilter TRUE = TrueClassFilter.INSTANCE;}//方法匹配器 MethodMatcher通过方法过滤切面public interface MethodMatcher {/**根据目标类和方法决定方法是否被通知。因为可以静态的判断,所以可以在AOP代理被创建时候调用一次这个方法。该方法的结果最终决定了通知是否被织入。**/boolean matches(Method method, Class<?> targetClass);// 1/**如果1返回true,2被调用来决定MethodMatcher的类型。有两种类型:静态和动态。静态切入点的意思是通知总是被执行。如果一个切入点是静态的,该方法返回false.动态切入点根据运行时方法的参数值决定通知是否需要执行。如果切入点是动态的,该方法返回true。和1.方法类似,该方法也是在代理创建时运行一次。**/boolean isRuntime();//2/**如果切入点是静态的,3.永远不会执行,对于动态切入点,需要根据运行时的参数决定方法是否被通知,所以会增加系统的负担,尽量使用静态切入点。**/boolean matches(Method method, Class<?> targetClass, Object[] args);//3MethodMatcher TRUE = TrueMethodMatcher.INSTANCE;}

理解Advisor

大多数切面是由定义切面行为的通知和定义切面在什么地方执行的切入点组合而成的。spring认识到了这一点,提供了Advisor类。他把通知和切入点组合到一个对象中。更确切地说PointcutAdvisor提供了这些功能。

PointcutAdvisor : 通知(行为)+ 切入点,可以把它理解为对通知的包装,增加定义切入点的功能。

public interface PointcutAdvisor{      Pointcut getPointcut();      Advice getAdvice();  }
这样方便在一个地方定义切入点和通知

使用spring的静态切入点 StaticMethodMatcherPointcut
        静态切入点只在代理创建的时候执行一次而不  是在运行期间每次方法调用都执行,所以性能  比动态切入点好,是首选的切入点方式。spring为创建静态切入点提供了方便的父类。 

  NameMatchMethodPointcut:名称匹配切入点方法通知
  public void setMappedName(String);
  public void setMappedNames(String);

<bean id="beforeAdvisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor"><property name="advice" ref="myMethodBeforeAdvice"></property><property name="mappedNames"><list><value>sayHello</value></list></property></bean>


原创粉丝点击