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

2014-11-24 03:05:50 · 作者: · 浏览: 4
; //缓存获取到的通知 this.methodCache.put(cacheKey, cached); } return cached; }

通过上面的源码我们看到,AdvisedSupport第一次获取通知时,会从通知链容器DefaultAdvisorChainFactory中通过getInterceptorsAndDynamicInterceptionAdvice方法获取指定的通知。

(2).DefaultAdvisorChainFactory获取指类,指定方法的通知:

DefaultAdvisorChainFactory通过getInterceptorsAndDynamicInterceptionAdvice方法获取指定类中指定方法的通知,源码如下:

[java] view plaincopyprint //获取通知 public ListgetInterceptorsAndDynamicInterceptionAdvice( Advised config, Method method, Class targetClass) { //根据AOP中配置的通知器创建一个保持获取到通知的集合 ListinterceptorList = new ArrayList(config.getAdvisors().length); //判断目标类中是否引入了配置的通知 boolean hasIntroductions = hasMatchingIntroductions(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; }