diff --git a/spring-context/src/test/java/org/springframework/context/annotation/configuration/BeanMethodQualificationTests.java b/spring-context/src/test/java/org/springframework/context/annotation/configuration/BeanMethodQualificationTests.java index 8765a53ebf..748281ddbf 100644 --- a/spring-context/src/test/java/org/springframework/context/annotation/configuration/BeanMethodQualificationTests.java +++ b/spring-context/src/test/java/org/springframework/context/annotation/configuration/BeanMethodQualificationTests.java @@ -23,6 +23,7 @@ import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.beans.factory.support.RootBeanDefinition; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -83,6 +84,19 @@ public class BeanMethodQualificationTests { assertThat(pojo.testBean.getName(), equalTo("interesting")); } + @Test + public void testCustomWithAsm() { + AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(); + ctx.registerBeanDefinition("customConfig", new RootBeanDefinition(CustomConfig.class.getName())); + RootBeanDefinition customPojo = new RootBeanDefinition(CustomPojo.class.getName()); + customPojo.setLazyInit(true); + ctx.registerBeanDefinition("customPojo", customPojo); + ctx.refresh(); + assertFalse(ctx.getBeanFactory().containsSingleton("testBean1")); + CustomPojo pojo = ctx.getBean(CustomPojo.class); + assertThat(pojo.testBean.getName(), equalTo("interesting")); + } + @Configuration static class StandardConfig { diff --git a/spring-core/src/main/java/org/springframework/core/type/classreading/AnnotationMetadataReadingVisitor.java b/spring-core/src/main/java/org/springframework/core/type/classreading/AnnotationMetadataReadingVisitor.java index 982534a379..80a49d9e55 100644 --- a/spring-core/src/main/java/org/springframework/core/type/classreading/AnnotationMetadataReadingVisitor.java +++ b/spring-core/src/main/java/org/springframework/core/type/classreading/AnnotationMetadataReadingVisitor.java @@ -29,9 +29,6 @@ import org.springframework.asm.Type; import org.springframework.core.annotation.AnnotationAttributes; import org.springframework.core.type.AnnotationMetadata; import org.springframework.core.type.MethodMetadata; -import org.springframework.util.CollectionUtils; -import org.springframework.util.LinkedMultiValueMap; -import org.springframework.util.MultiValueMap; /** * ASM class visitor which looks for the class name and implemented types as @@ -47,13 +44,13 @@ final class AnnotationMetadataReadingVisitor extends ClassMetadataReadingVisitor private final ClassLoader classLoader; - private final Set annotationSet = new LinkedHashSet(); + private final Set annotationSet = new LinkedHashSet(4); private final Map> metaAnnotationMap = new LinkedHashMap>(4); private final Map attributeMap = new LinkedHashMap(4); - private final MultiValueMap methodMetadataMap = new LinkedMultiValueMap(); + private final Set methodMetadataSet = new LinkedHashSet(4); public AnnotationMetadataReadingVisitor(ClassLoader classLoader) { @@ -63,7 +60,7 @@ final class AnnotationMetadataReadingVisitor extends ClassMetadataReadingVisitor @Override public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { - return new MethodMetadataReadingVisitor(name, access, this.getClassName(), this.classLoader, this.methodMetadataMap); + return new MethodMetadataReadingVisitor(name, access, getClassName(), this.classLoader, this.methodMetadataSet); } @Override @@ -162,16 +159,21 @@ final class AnnotationMetadataReadingVisitor extends ClassMetadataReadingVisitor } public boolean hasAnnotatedMethods(String annotationType) { - return this.methodMetadataMap.containsKey(annotationType); + for (MethodMetadata methodMetadata : this.methodMetadataSet) { + if (methodMetadata.isAnnotated(annotationType)) { + return true; + } + } + return false; } public Set getAnnotatedMethods(String annotationType) { - List list = this.methodMetadataMap.get(annotationType); - if (CollectionUtils.isEmpty(list)) { - return new LinkedHashSet(0); + Set annotatedMethods = new LinkedHashSet(4); + for (MethodMetadata methodMetadata : this.methodMetadataSet) { + if (methodMetadata.isAnnotated(annotationType)) { + annotatedMethods.add(methodMetadata); + } } - Set annotatedMethods = new LinkedHashSet(list.size()); - annotatedMethods.addAll(list); return annotatedMethods; } diff --git a/spring-core/src/main/java/org/springframework/core/type/classreading/MethodMetadataReadingVisitor.java b/spring-core/src/main/java/org/springframework/core/type/classreading/MethodMetadataReadingVisitor.java index 3250d16335..1155936e3d 100644 --- a/spring-core/src/main/java/org/springframework/core/type/classreading/MethodMetadataReadingVisitor.java +++ b/spring-core/src/main/java/org/springframework/core/type/classreading/MethodMetadataReadingVisitor.java @@ -18,6 +18,7 @@ package org.springframework.core.type.classreading; import java.util.LinkedHashMap; import java.util.Map; +import java.util.Set; import org.springframework.asm.AnnotationVisitor; import org.springframework.asm.MethodVisitor; @@ -49,27 +50,27 @@ final class MethodMetadataReadingVisitor extends MethodVisitor implements Method private final ClassLoader classLoader; - private final MultiValueMap methodMetadataMap; + private final Set methodMetadataSet; private final Map attributeMap = new LinkedHashMap(2); - public MethodMetadataReadingVisitor(String name, int access, String declaringClassName, ClassLoader classLoader, - MultiValueMap methodMetadataMap) { + public MethodMetadataReadingVisitor(String name, int access, String declaringClassName, + ClassLoader classLoader, Set methodMetadataSet) { super(SpringAsmInfo.ASM_VERSION); this.name = name; this.access = access; this.declaringClassName = declaringClassName; this.classLoader = classLoader; - this.methodMetadataMap = methodMetadataMap; + this.methodMetadataSet = methodMetadataSet; } @Override public AnnotationVisitor visitAnnotation(final String desc, boolean visible) { String className = Type.getType(desc).getClassName(); - this.methodMetadataMap.add(className, this); + this.methodMetadataSet.add(this); return new AnnotationAttributesReadingVisitor(className, this.attributeMap, null, this.classLoader); }