Spring框架学习[AOP通知以及编程式AOP ](五)

2014-11-24 03:05:50 · 作者: · 浏览: 2
s(config, targetClass); //获取通知适配器注册单态模式对象 AdvisorAdapterRegistry registry = GlobalAdvisorAdapterRegistry.getInstance(); //遍历AOP配置的通知 for (Advisor advisor : config.getAdvisors()) { //如果通知器的类型是切入点通知器 if (advisor instanceof PointcutAdvisor) { PointcutAdvisor pointcutAdvisor = (PointcutAdvisor) advisor; //如果AOP配置对通知已经过滤,即只包含符合条件的通知器,或者 //获取当前切入点的类过滤器匹配目标类 if (config.isPreFiltered() || pointcutAdvisor.getPointcut().getClassFilter().matches(targetClass)) { //获取通知器中的方法拦截器列表 MethodInterceptor[] interceptors = registry.getInterceptors(advisor); //获取当前通知器切入点的方法匹配器 MethodMatcher mm = pointcutAdvisor.getPointcut().getMethodMatcher(); //如果目标类的方法匹配切入点 if (MethodMatchers.matches(mm, method, targetClass, hasIntroductions)) { //如果方法匹配器是运行时动态匹配的 if (mm.isRuntime()) { //将通知器中的方法拦截器和方法匹配器封装后添加到返回的通知器集合中 for (MethodInterceptor interceptor : interceptors) { interceptorList.add(new InterceptorAndDynamicMethodMatcher(interceptor, mm)); } } //如果方法匹配器是静态的,则将方法拦截器直接添加到返回的通知器集合中 else { interceptorList.addAll(Arrays.asList(interceptors)); } } } } //如果通知器类型是引入通知器 else if (advisor instanceof IntroductionAdvisor) { IntroductionAdvisor ia = (IntroductionAdvisor) advisor; //如果AOP通知配置是预过滤的,或者目标类符合当前通知器的类过滤器 if (config.isPreFiltered() || ia.getClassFilter().matches(targetClass)) { //获取通知器中所有的方法拦截器,即通知 Interceptor[] interceptors = registry.getInterceptors(advisor); //将通知添加到要返回的通知集合中 interceptorList.addAll(Arrays.asList(interceptors)); } } //如果通知类型既不是切入点通知器,又不是引入通知器 else { Interceptor[] interceptors = registry.getInterceptors(advisor); //直接将通知添加到要返回的通知集合中 interceptorList.addAll(Arrays.asList(interceptors)); } } return interceptorList; }//检查目标类和AOP通知配置是否匹配AOP引入规则private static boolean hasMatchingIntroductions(Advised config, Class targetClass) { //遍历所有的通知器 for (int i = 0; i < config.getAdvisors().length; i++) { Advisor advisor = config.getAdvisors()[i]; //如果通知器是引入通知器 if (advisor instanceof IntroductionAdvisor) { IntroductionAdvisor ia = (IntroductionAdvisor) advisor; //使用当前通知器的类过滤器匹配目标类 if (ia.getClassFilter().matches(targetClass)) { return true; } } } return false; }

通过上面DefaultAdvisorChainFactory获取通知过程源码的分析,我们看到通过AdvisorAdapterRegistry的getInterceptors方法获取通知器的通知,AdvisorAdapterRegistry是一个接口,具体的实现交由其实现类DefaultAdvisorAdapterRegistry提供。

3.DefaultAdvisorAdapterRegistry获取通知器的通知:

DefaultAdvisorAdapterRegistry的源码如下:

[java] view plaincopyprint public class DefaultAdvisorAdapterRegistry implements AdvisorAdapterRegistry, Serializable { //持有通知适配器的集合 private final List adapters = new ArrayList (3); //构造方法,为通知适配器集合添加Spring的3种类型通知适配器 public DefaultAdvisorAdapterRegistry() { registerAdvisorAdapter(new MethodBeforeAdviceAdapter()); registerAdvisorAdapter(new AfterReturningAdviceAdapter()); registerAdvisorAdapter(new ThrowsAdviceAdapter()); } //将通知封装为通知器 public Advisor wrap(Object adviceObject) throws UnknownAdviceTypeException { //如果通知对象是通知器类型,则不用封装 if (adviceObject instanceof Advisor) { return (Advisor) adviceObject; } if (!(adviceObject instanceof Advice)) { throw new UnknownAdviceTypeException(adviceObject); } Advice advice = (Advice) adviceObject; //如果通知是方法拦截器 if (advice instanceof MethodInterceptor) { //将方法拦截器类型的通知封装为默认切入点通知器 return new DefaultPointcutAdvisor(advice); } for (AdvisorAdapter adapter : this.adapters) { //检查通知适配器是否支持给定的通知 if (adapter.supportsAdvice(advice)) { return new Defaul