在前面四个例子中,只要实现一个Advice,然后调用ProxyFactory.addAdvice()方法为代理设定通知,不用设置切入点,从代理对上调用的方法就被通知到了。其原因就在于执行addAdvice()方法时,ProxyFactory会将Advice对象委派给addAdvistor()方法,后台会自动创建一个DefaultPointcutAdvistor实例,并将Advice加入其中。而默认的DefaultPointcutAdvistor会将切入点设为所有的方法。
假如我们不想通过代理来执行某些方法,也就是说,在执行某些方法的时候不通知,这时候该如何实现呢?
Spring提供一系列接口来实现这个目标。最主要的接口如下:
implements org.springframework.aop.Pointcut
org.springframework.aop.ClassFilter
org.springframework.aop.MethodMatcher
下面看看几个关键接口的定义:
1、切入点(Pointcut)
/**
* 切入点
*/
public interface Pointcut {
//切入点的一个单例
public static final Pointcut TRUE = TruePointcut.INSTANCE;
//类过滤器
public ClassFilter getClassFilter();
//方法过滤器
public MethodMatcher getMethodMatcher();
}
/**
* 类过滤器
*/
public interface ClassFilter {
//类过滤器单例
public static final ClassFilter TRUE = TrueClassFilter.INSTANCE;
//类匹配方法
public boolean matches(Class class1);
}
/**
* 方法过滤器
*/
public interface MethodMatcher {
//方法过滤器单例
public static final MethodMatcher TRUE = TrueMethodMatcher.INSTANCE;
//静态方法匹配方法
public boolean matches(Method method, Class class1);
//判断静态还是动态匹配,返回true动态匹配,false静态匹配
public boolean isRuntime();
//对象(动态)匹配方法
public boolean matches(Method method, Class class1, Object aobj[]);
}
2、通知者(Advisor)
/**
* 通知者接口
*/
public interface Advisor {
//切面是否为per instance
public boolean isPerInstance();
//获取切面上的通知
public Advice getAdvice();
}
/**
* 通知者子接口,Spring中标准的切面都应该实现此接口
*/
public PointcutAdvisor extends Advisor {
//获取通知者的切点
public Pointcut getPointcut();
}
为了看的明白,还是回顾一下框架图:


相关文章

相关产品和培训

文章评论
友情推荐链接