diff --git a/spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassParser.java b/spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassParser.java index 6e06766437..8b03db8e54 100644 --- a/spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassParser.java +++ b/spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassParser.java @@ -185,8 +185,7 @@ class ConfigurationClassParser { protected void processConfigurationClass(ConfigurationClass configClass) throws IOException { - - if (conditionEvaluator.shouldSkip(configClass.getMetadata(), ConfigurationPhase.PARSE_CONFIGURATION)) { + if (this.conditionEvaluator.shouldSkip(configClass.getMetadata(), ConfigurationPhase.PARSE_CONFIGURATION)) { return; } @@ -219,9 +218,7 @@ class ConfigurationClassParser { * @param sourceClass a source class * @return the superclass, {@code null} if none found or previously processed */ - protected final SourceClass doProcessConfigurationClass( - ConfigurationClass configClass, SourceClass sourceClass) throws IOException { - + protected final SourceClass doProcessConfigurationClass(ConfigurationClass configClass, SourceClass sourceClass) throws IOException { // recursively process any member (nested) classes first processMemberClasses(configClass, sourceClass); @@ -350,18 +347,15 @@ class ConfigurationClassParser { * meta-annotations it is valid to have several {@code @Import}s declared with * different values, the usual process or returning values from the first * meta-annotation on a class is not sufficient. - *

- * For example, it is common for a {@code @Configuration} class to declare direct + *

For example, it is common for a {@code @Configuration} class to declare direct * {@code @Import}s in addition to meta-imports originating from an {@code @Enable} * annotation. - * * @param sourceClass the class to search * @param imports the imports collected so far * @param visited used to track visited classes to prevent infinite recursion * @throws IOException if there is any problem reading metadata from the named class */ - private void collectImports(SourceClass sourceClass, Set imports, - Set visited) throws IOException { + private void collectImports(SourceClass sourceClass, Set imports, Set visited) throws IOException { try { if (visited.add(sourceClass)) { for (SourceClass annotation : sourceClass.getAnnotations()) { @@ -392,9 +386,9 @@ class ConfigurationClassParser { this.deferredImportSelectors.clear(); } - private void processImports(ConfigurationClass configClass, - Collection sourceClasses, boolean checkForCircularImports) + private void processImports(ConfigurationClass configClass, Collection sourceClasses, boolean checkForCircularImports) throws IOException { + if(sourceClasses.isEmpty()) { return; } @@ -494,8 +488,7 @@ class ConfigurationClassParser { /** * Factory method to obtain a {@link SourceClass} from a {@link ConfigurationClass}. */ - public SourceClass asSourceClass(ConfigurationClass configurationClass) - throws IOException { + public SourceClass asSourceClass(ConfigurationClass configurationClass) throws IOException { try { AnnotationMetadata metadata = configurationClass.getMetadata(); if (metadata instanceof StandardAnnotationMetadata) { @@ -511,8 +504,7 @@ class ConfigurationClassParser { /** * Factory method to obtain a {@link SourceClass} from a {@link Class}. */ - public SourceClass asSourceClass(Class classType) - throws ClassNotFoundException, IOException { + public SourceClass asSourceClass(Class classType) throws IOException, ClassNotFoundException { try { // Sanity test that we can read annotations, if not fall back to ASM classType.getAnnotations(); @@ -526,10 +518,9 @@ class ConfigurationClassParser { /** * Factory method to obtain {@link SourceClass}s from class names. */ - public Collection asSourceClasses(String[] classNamess) - throws ClassNotFoundException, IOException { + public Collection asSourceClasses(String[] classNames) throws IOException, ClassNotFoundException { List annotatedClasses = new ArrayList(); - for (String className : classNamess) { + for (String className : classNames) { annotatedClasses.add(asSourceClass(className)); } return annotatedClasses; @@ -538,12 +529,10 @@ class ConfigurationClassParser { /** * Factory method to obtain a {@link SourceClass} from a class name. */ - public SourceClass asSourceClass(String className) - throws ClassNotFoundException, IOException { + public SourceClass asSourceClass(String className) throws IOException, ClassNotFoundException { if (className.startsWith("java")) { // Never use ASM for core java types - return new SourceClass(this.resourceLoader.getClassLoader().loadClass( - className)); + return new SourceClass(this.resourceLoader.getClassLoader().loadClass( className)); } return new SourceClass(this.metadataReaderFactory.getMetadataReader(className)); } @@ -642,8 +631,7 @@ class ConfigurationClassParser { private final AnnotationMetadata metadata; - - private SourceClass(Object source) { + public SourceClass(Object source) { this.source = source; if (source instanceof Class) { this.metadata = new StandardAnnotationMetadata((Class) source, true); @@ -653,40 +641,42 @@ class ConfigurationClassParser { } } + public final AnnotationMetadata getMetadata() { + return this.metadata; + } public Class loadClass() throws ClassNotFoundException { - if(source instanceof Class) { - return (Class) source; + if (this.source instanceof Class) { + return (Class) this.source; } String className = ((MetadataReader) source).getClassMetadata().getClassName(); return resourceLoader.getClassLoader().loadClass(className); } public boolean isAssignable(Class clazz) throws IOException { - if (source instanceof Class) { - return clazz.isAssignableFrom((Class) source); + if (this.source instanceof Class) { + return clazz.isAssignableFrom((Class) this.source); } - return new AssignableTypeFilter(clazz).match((MetadataReader) source, - metadataReaderFactory); + return new AssignableTypeFilter(clazz).match((MetadataReader) this.source, metadataReaderFactory); } - public ConfigurationClass asConfigClass(ConfigurationClass importedBy) - throws IOException { + public ConfigurationClass asConfigClass(ConfigurationClass importedBy) throws IOException { if (this.source instanceof Class) { return new ConfigurationClass((Class) this.source, importedBy); } - return new ConfigurationClass((MetadataReader) source, importedBy); + return new ConfigurationClass((MetadataReader) this.source, importedBy); } public Collection getMemberClasses() throws IOException { List members = new ArrayList(); - if (source instanceof Class) { - Class sourceClass = (Class) source; + if (this.source instanceof Class) { + Class sourceClass = (Class) this.source; for (Class declaredClass : sourceClass.getDeclaredClasses()) { try { members.add(asSourceClass(declaredClass)); } - catch (ClassNotFoundException e) { + catch (ClassNotFoundException ex) { + // ignore } } } @@ -696,34 +686,34 @@ class ConfigurationClassParser { try { members.add(asSourceClass(memberClassName)); } - catch (ClassNotFoundException e) { + catch (ClassNotFoundException ex) { + // ignore } } } return members; } - public SourceClass getSuperClass() throws ClassNotFoundException, IOException { - if (source instanceof Class) { - return asSourceClass(((Class) source).getSuperclass()); + public SourceClass getSuperClass() throws IOException, ClassNotFoundException { + if (this.source instanceof Class) { + return asSourceClass(((Class) this.source).getSuperclass()); } - return asSourceClass(((MetadataReader) source).getClassMetadata().getSuperClassName()); + return asSourceClass(((MetadataReader) this.source).getClassMetadata().getSuperClassName()); } - public Set getAnnotations() throws ClassNotFoundException, IOException { + public Set getAnnotations() throws IOException, ClassNotFoundException { Set annotations = new LinkedHashSet(); - for(String annotation : getMetadata().getAnnotationTypes()) { + for (String annotation : this.metadata.getAnnotationTypes()) { annotations.add(getRelated(annotation)); } return annotations; } - public Collection getAnnotationAttributes(String annotationType, - String attribute) throws ClassNotFoundException, IOException { - Map annotationAttributes = getMetadata().getAnnotationAttributes( - annotationType, true); - if (annotationAttributes == null - || !annotationAttributes.containsKey(attribute)) { + public Collection getAnnotationAttributes(String annotationType, String attribute) + throws IOException, ClassNotFoundException { + + Map annotationAttributes = this.metadata.getAnnotationAttributes(annotationType, true); + if (annotationAttributes == null || !annotationAttributes.containsKey(attribute)) { return Collections.emptySet(); } String[] classNames = (String[]) annotationAttributes.get(attribute); @@ -734,45 +724,33 @@ class ConfigurationClassParser { return rtn; } - private SourceClass getRelated(String className) throws IOException, - ClassNotFoundException { - if (source instanceof Class) { + private SourceClass getRelated(String className) throws IOException, ClassNotFoundException { + if (this.source instanceof Class) { try { Class clazz = resourceLoader.getClassLoader().loadClass(className); return asSourceClass(clazz); } catch (ClassNotFoundException ex) { + // ignore } } return asSourceClass(className); } - public AnnotationMetadata getMetadata() { - return this.metadata; - } - @Override - public int hashCode() { - return toString().hashCode(); + public boolean equals(Object other) { + return (this == other || (other instanceof SourceClass && + this.metadata.getClassName().equals(((SourceClass) other).metadata.getClassName()))); } @Override - public boolean equals(Object obj) { - if (obj == this) { - return true; - } - if (obj == null) { - return false; - } - if (obj instanceof SourceClass) { - return toString().equals(obj.toString()); - } - return false; + public int hashCode() { + return this.metadata.getClassName().hashCode(); } @Override public String toString() { - return getMetadata().getClassName(); + return this.metadata.getClassName(); } } diff --git a/spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassUtils.java b/spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassUtils.java index 46a58b7eb0..090846c794 100644 --- a/spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassUtils.java +++ b/spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassUtils.java @@ -20,6 +20,7 @@ import java.io.IOException; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; + import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.support.AbstractBeanDefinition; import org.springframework.core.Conventions; @@ -36,14 +37,14 @@ import org.springframework.core.type.classreading.MetadataReaderFactory; */ abstract class ConfigurationClassUtils { - private static final Log logger = LogFactory.getLog(ConfigurationClassUtils.class); - private static final String CONFIGURATION_CLASS_FULL = "full"; private static final String CONFIGURATION_CLASS_LITE = "lite"; private static final String CONFIGURATION_CLASS_ATTRIBUTE = - Conventions.getQualifiedAttributeName(ConfigurationClassPostProcessor.class, "configurationClass"); + Conventions.getQualifiedAttributeName(ConfigurationClassPostProcessor.class, "configurationClass"); + + private static final Log logger = LogFactory.getLog(ConfigurationClassUtils.class); /** @@ -92,7 +93,7 @@ abstract class ConfigurationClassUtils { } public static boolean isConfigurationCandidate(AnnotationMetadata metadata) { - return isFullConfigurationCandidate(metadata) || isLiteConfigurationCandidate(metadata); + return (isFullConfigurationCandidate(metadata) || isLiteConfigurationCandidate(metadata)); } public static boolean isFullConfigurationCandidate(AnnotationMetadata metadata) { @@ -100,14 +101,11 @@ abstract class ConfigurationClassUtils { } public static boolean isLiteConfigurationCandidate(AnnotationMetadata metadata) { - if(metadata.isInterface()) { - return false; // do not consider an interface or an annotation - } - return metadata.isAnnotated(Import.class.getName()) || - metadata.hasAnnotatedMethods(Bean.class.getName()); + // Do not consider an interface or an annotation... + return (!metadata.isInterface() && ( + metadata.isAnnotated(Import.class.getName()) || metadata.hasAnnotatedMethods(Bean.class.getName()))); } - /** * Determine whether the given bean definition indicates a full @Configuration class. */