Avoid unnecessary annotation introspection on framework methods
Issue: SPR-16933
This commit is contained in:
@@ -188,8 +188,8 @@ class ConfigurationClassEnhancer {
|
||||
@Override
|
||||
public int accept(Method method) {
|
||||
for (int i = 0; i < this.callbacks.length; i++) {
|
||||
if (!(this.callbacks[i] instanceof ConditionalCallback) ||
|
||||
((ConditionalCallback) this.callbacks[i]).isMatch(method)) {
|
||||
Callback callback = this.callbacks[i];
|
||||
if (!(callback instanceof ConditionalCallback) || ((ConditionalCallback) callback).isMatch(method)) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
@@ -285,6 +285,10 @@ class ConfigurationClassEnhancer {
|
||||
|
||||
@Override
|
||||
public boolean isMatch(Method candidateMethod) {
|
||||
return isSetBeanFactory(candidateMethod);
|
||||
}
|
||||
|
||||
public static boolean isSetBeanFactory(Method candidateMethod) {
|
||||
return (candidateMethod.getName().equals("setBeanFactory") &&
|
||||
candidateMethod.getParameterCount() == 1 &&
|
||||
BeanFactory.class == candidateMethod.getParameterTypes()[0] &&
|
||||
@@ -430,6 +434,7 @@ class ConfigurationClassEnhancer {
|
||||
@Override
|
||||
public boolean isMatch(Method candidateMethod) {
|
||||
return (candidateMethod.getDeclaringClass() != Object.class &&
|
||||
!BeanFactoryAwareMethodInterceptor.isSetBeanFactory(candidateMethod) &&
|
||||
BeanAnnotationHelper.isBeanAnnotated(candidateMethod));
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2017 the original author or authors.
|
||||
* Copyright 2002-2018 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -41,6 +41,7 @@ import org.springframework.core.MethodIntrospector;
|
||||
import org.springframework.core.annotation.AnnotatedElementUtils;
|
||||
import org.springframework.core.annotation.AnnotationAwareOrderComparator;
|
||||
import org.springframework.lang.Nullable;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.util.Assert;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
|
||||
@@ -137,7 +138,7 @@ public class EventListenerMethodProcessor implements SmartInitializingSingleton,
|
||||
protected void processBean(
|
||||
final List<EventListenerFactory> factories, final String beanName, final Class<?> targetType) {
|
||||
|
||||
if (!this.nonAnnotatedClasses.contains(targetType)) {
|
||||
if (!this.nonAnnotatedClasses.contains(targetType) && !isSpringContainerClass(targetType)) {
|
||||
Map<Method, EventListener> annotatedMethods = null;
|
||||
try {
|
||||
annotatedMethods = MethodIntrospector.selectMethods(targetType,
|
||||
@@ -181,4 +182,16 @@ public class EventListenerMethodProcessor implements SmartInitializingSingleton,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Determine whether the given class is an {@code org.springframework}
|
||||
* bean class that is not annotated as a user or test {@link Component}...
|
||||
* which indicates that there is no {@link EventListener} to be found there.
|
||||
* @since 5.1
|
||||
*/
|
||||
private static boolean isSpringContainerClass(Class<?> clazz) {
|
||||
return (clazz.getName().startsWith("org.springframework.") &&
|
||||
!AnnotatedElementUtils.isAnnotated(clazz, Component.class));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user