ASP源码.NET源码PHP源码JSP源码JAVA源码DELPHI源码PB源码VC源码VB源码Android源码

spring-aop组件详解——ClassFilter类过滤器(1/2)

来源:网络整理     时间:2016-06-01     关键词:Spring,filter

本篇文章主要介绍了"spring-aop组件详解——ClassFilter类过滤器",主要涉及到Spring,filter方面的内容,对于其他编程jrs看球网直播吧_低调看直播体育app软件下载_低调看体育直播感兴趣的同学可以参考一下: 术语定义:ClassFilter:类过滤器Advisor:通知器targetClass:目标类,或称被代理的原始类Advice:通知,或称拦截器,也就是要增强的...

术语定义:

  1. ClassFilter:类过滤器
  2. Advisor:通知器
  3. targetClass:目标类,或称被代理的原始类
  4. Advice:通知,或称拦截器,也就是要增强的代码逻辑
  5. MethodMatcher:方法匹配器
  6. Pointcut:切点,由ClassFilter和MethodMatcher组成

        ClassFilter,用于约束一个Advisor,与指定的targetClass是否匹配。只有匹配的前提下,Advisor才能使用其内部持有的Advice对targetClass进行增强。

        Advisor分两大类:IntroductionAdvisor(引介通知器)和PointcutAdvisor(切点通知器)。两类Advisor都是为了增强targetClass,但是作用不一样。IntroductionAdvisor主要为了给targetClass追加接口(或者说追加更多的方法),这种增强属于类级别的增强;而PointcutAdvisor主要为了拦截方法,这种增强属于方法级别的增强。

        正是由于两类Advisor的增强级别不同,而导致了对ClassFilter的使用方式不同。IntroductionAdvisor进行类级别增强,因此只需要直接持有ClassFilter即可;而PointcutAdvisor进行方法级别增强,因此需要同时使用ClassFilter和MethodMatcher(方法匹配器)。PointcutAdvisor内部持有一个Pointcut,而Pointcut就是由ClassFilter和MethodMatcher组成的。

        ClassFilter只定义了唯一的方法,代码如下:

	/**
	 * 当前类过滤器是否与指定的类型匹配,
	 * 如果匹配,则需要把自身内部持有的Advice应用的目标类上。
	 * 
	 * @param clazz 候选目标类
	 * @return Advice通知是否应该应用到指定的目标类
	 */
	public abstract boolean matches(Class clazz);

        ClassFilter组件的体系图如下:

从图中可以看出,ClassFilter有4中简单方式的实现:

  1. TypePatternClassFilter:基于AspectJ的类型匹配实现
  2. AnnotationClassFilter:通过检查目标类是否存在指定的注解,决定是否匹配
  3. RootClassFilter:通过判断目标类是否是指定类型(或其子类型),决定是否匹配
  4. TrueClassFilter:这是最简单实现,matches方法总会返回true。此类设计使用了单例模式,且其对象引用直接被在ClassFilter接口中声明成了常量。

        除此之外,还有两种特殊方式的实现:

相关图片

相关文章