public static List calculateInterceptorsAndDynamicInterceptionAdvice(Advised config,
Object proxy,
Method method,
Class targetClass) {
List interceptors = new ArrayList(config.getAdvisors().length);
AdvisorAdapterRegistry registry = GlobalAdvisorAdapterRegistry.getInstance();
for (int i = 0; i < config.getAdvisors().length; i++) {
Advisor advisor = config.getAdvisors()[i];
if (advisor instanceof PointcutAdvisor) {
// add it conditionally
PointcutAdvisor pointcutAdvisor = (PointcutAdvisor) advisor;
if (pointcutAdvisor.getPointcut().getClassFilter().matches(targetClass)) {
MethodInterceptor interceptor = (MethodInterceptor) registry.getInterceptor(advisor);
MethodMatcher mm = pointcutAdvisor.getPointcut().getMethodMatcher();
if (mm.matches(method, targetClass)) {
if (mm.isRuntime()) {
// Creating a new object instance in the getInterceptor() method
// isn't a problem as we normally cache created chains.
interceptors.add(new InterceptorAndDynamicMethodMatcher(interceptor, mm) );
}
else {
interceptors.add(interceptor);
}
}
}
}
else if (advisor instanceof IntroductionAdvisor) {
IntroductionAdvisor ia = (IntroductionAdvisor) advisor;
if (ia.getClassFilter().matches(targetClass)) {
MethodInterceptor interceptor = (MethodInterceptor) registry.getInterceptor(advisor);
interceptors.add(interceptor);
}
}
}
return interceptors;
}
Return the static interceptors and dynamic interception advice that may apply
to this method invocation. |