Browse Source

Polishing

pull/27100/head
Sam Brannen 3 years ago
parent
commit
1bc236785c
  1. 4
      spring-context/src/main/java/org/springframework/context/annotation/BeanMethod.java
  2. 42
      spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClass.java
  3. 6
      spring-context/src/test/java/org/springframework/context/annotation/BeanMethodPolymorphismTests.java
  4. 6
      spring-core/src/main/java/org/springframework/core/type/StandardAnnotationMetadata.java
  5. 38
      spring-core/src/test/java/org/springframework/core/type/AbstractClassMetadataMemberClassTests.java
  6. 4
      spring-core/src/test/java/org/springframework/core/type/classreading/AnnotationMetadataReadingVisitorTests.java

4
spring-context/src/main/java/org/springframework/context/annotation/BeanMethod.java

@ -33,7 +33,7 @@ import org.springframework.core.type.MethodMetadata;
*/ */
final class BeanMethod extends ConfigurationMethod { final class BeanMethod extends ConfigurationMethod {
public BeanMethod(MethodMetadata metadata, ConfigurationClass configurationClass) { BeanMethod(MethodMetadata metadata, ConfigurationClass configurationClass) {
super(metadata, configurationClass); super(metadata, configurationClass);
} }
@ -55,7 +55,7 @@ final class BeanMethod extends ConfigurationMethod {
private class NonOverridableMethodError extends Problem { private class NonOverridableMethodError extends Problem {
public NonOverridableMethodError() { NonOverridableMethodError() {
super(String.format("@Bean method '%s' must not be private or final; change the method's modifiers to continue", super(String.format("@Bean method '%s' must not be private or final; change the method's modifiers to continue",
getMetadata().getMethodName()), getResourceLocation()); getMetadata().getMethodName()), getResourceLocation());
} }

42
spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClass.java

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2019 the original author or authors. * Copyright 2002-2021 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -36,7 +36,7 @@ import org.springframework.util.ClassUtils;
/** /**
* Represents a user-defined {@link Configuration @Configuration} class. * Represents a user-defined {@link Configuration @Configuration} class.
* Includes a set of {@link Bean} methods, including all such methods * <p>Includes a set of {@link Bean} methods, including all such methods
* defined in the ancestry of the class, in a 'flattened-out' manner. * defined in the ancestry of the class, in a 'flattened-out' manner.
* *
* @author Chris Beams * @author Chris Beams
@ -74,7 +74,7 @@ final class ConfigurationClass {
* @param beanName must not be {@code null} * @param beanName must not be {@code null}
* @see ConfigurationClass#ConfigurationClass(Class, ConfigurationClass) * @see ConfigurationClass#ConfigurationClass(Class, ConfigurationClass)
*/ */
public ConfigurationClass(MetadataReader metadataReader, String beanName) { ConfigurationClass(MetadataReader metadataReader, String beanName) {
Assert.notNull(beanName, "Bean name must not be null"); Assert.notNull(beanName, "Bean name must not be null");
this.metadata = metadataReader.getAnnotationMetadata(); this.metadata = metadataReader.getAnnotationMetadata();
this.resource = metadataReader.getResource(); this.resource = metadataReader.getResource();
@ -89,7 +89,7 @@ final class ConfigurationClass {
* @param importedBy the configuration class importing this one or {@code null} * @param importedBy the configuration class importing this one or {@code null}
* @since 3.1.1 * @since 3.1.1
*/ */
public ConfigurationClass(MetadataReader metadataReader, @Nullable ConfigurationClass importedBy) { ConfigurationClass(MetadataReader metadataReader, @Nullable ConfigurationClass importedBy) {
this.metadata = metadataReader.getAnnotationMetadata(); this.metadata = metadataReader.getAnnotationMetadata();
this.resource = metadataReader.getResource(); this.resource = metadataReader.getResource();
this.importedBy.add(importedBy); this.importedBy.add(importedBy);
@ -101,7 +101,7 @@ final class ConfigurationClass {
* @param beanName name of the {@code @Configuration} class bean * @param beanName name of the {@code @Configuration} class bean
* @see ConfigurationClass#ConfigurationClass(Class, ConfigurationClass) * @see ConfigurationClass#ConfigurationClass(Class, ConfigurationClass)
*/ */
public ConfigurationClass(Class<?> clazz, String beanName) { ConfigurationClass(Class<?> clazz, String beanName) {
Assert.notNull(beanName, "Bean name must not be null"); Assert.notNull(beanName, "Bean name must not be null");
this.metadata = AnnotationMetadata.introspect(clazz); this.metadata = AnnotationMetadata.introspect(clazz);
this.resource = new DescriptiveResource(clazz.getName()); this.resource = new DescriptiveResource(clazz.getName());
@ -116,7 +116,7 @@ final class ConfigurationClass {
* @param importedBy the configuration class importing this one (or {@code null}) * @param importedBy the configuration class importing this one (or {@code null})
* @since 3.1.1 * @since 3.1.1
*/ */
public ConfigurationClass(Class<?> clazz, @Nullable ConfigurationClass importedBy) { ConfigurationClass(Class<?> clazz, @Nullable ConfigurationClass importedBy) {
this.metadata = AnnotationMetadata.introspect(clazz); this.metadata = AnnotationMetadata.introspect(clazz);
this.resource = new DescriptiveResource(clazz.getName()); this.resource = new DescriptiveResource(clazz.getName());
this.importedBy.add(importedBy); this.importedBy.add(importedBy);
@ -128,7 +128,7 @@ final class ConfigurationClass {
* @param beanName name of the {@code @Configuration} class bean * @param beanName name of the {@code @Configuration} class bean
* @see ConfigurationClass#ConfigurationClass(Class, ConfigurationClass) * @see ConfigurationClass#ConfigurationClass(Class, ConfigurationClass)
*/ */
public ConfigurationClass(AnnotationMetadata metadata, String beanName) { ConfigurationClass(AnnotationMetadata metadata, String beanName) {
Assert.notNull(beanName, "Bean name must not be null"); Assert.notNull(beanName, "Bean name must not be null");
this.metadata = metadata; this.metadata = metadata;
this.resource = new DescriptiveResource(metadata.getClassName()); this.resource = new DescriptiveResource(metadata.getClassName());
@ -136,19 +136,19 @@ final class ConfigurationClass {
} }
public AnnotationMetadata getMetadata() { AnnotationMetadata getMetadata() {
return this.metadata; return this.metadata;
} }
public Resource getResource() { Resource getResource() {
return this.resource; return this.resource;
} }
public String getSimpleName() { String getSimpleName() {
return ClassUtils.getShortName(getMetadata().getClassName()); return ClassUtils.getShortName(getMetadata().getClassName());
} }
public void setBeanName(String beanName) { void setBeanName(String beanName) {
this.beanName = beanName; this.beanName = beanName;
} }
@ -171,7 +171,7 @@ final class ConfigurationClass {
* Merge the imported-by declarations from the given configuration class into this one. * Merge the imported-by declarations from the given configuration class into this one.
* @since 4.0.5 * @since 4.0.5
*/ */
public void mergeImportedBy(ConfigurationClass otherConfigClass) { void mergeImportedBy(ConfigurationClass otherConfigClass) {
this.importedBy.addAll(otherConfigClass.importedBy); this.importedBy.addAll(otherConfigClass.importedBy);
} }
@ -181,35 +181,35 @@ final class ConfigurationClass {
* @since 4.0.5 * @since 4.0.5
* @see #isImported() * @see #isImported()
*/ */
public Set<ConfigurationClass> getImportedBy() { Set<ConfigurationClass> getImportedBy() {
return this.importedBy; return this.importedBy;
} }
public void addBeanMethod(BeanMethod method) { void addBeanMethod(BeanMethod method) {
this.beanMethods.add(method); this.beanMethods.add(method);
} }
public Set<BeanMethod> getBeanMethods() { Set<BeanMethod> getBeanMethods() {
return this.beanMethods; return this.beanMethods;
} }
public void addImportedResource(String importedResource, Class<? extends BeanDefinitionReader> readerClass) { void addImportedResource(String importedResource, Class<? extends BeanDefinitionReader> readerClass) {
this.importedResources.put(importedResource, readerClass); this.importedResources.put(importedResource, readerClass);
} }
public void addImportBeanDefinitionRegistrar(ImportBeanDefinitionRegistrar registrar, AnnotationMetadata importingClassMetadata) { void addImportBeanDefinitionRegistrar(ImportBeanDefinitionRegistrar registrar, AnnotationMetadata importingClassMetadata) {
this.importBeanDefinitionRegistrars.put(registrar, importingClassMetadata); this.importBeanDefinitionRegistrars.put(registrar, importingClassMetadata);
} }
public Map<ImportBeanDefinitionRegistrar, AnnotationMetadata> getImportBeanDefinitionRegistrars() { Map<ImportBeanDefinitionRegistrar, AnnotationMetadata> getImportBeanDefinitionRegistrars() {
return this.importBeanDefinitionRegistrars; return this.importBeanDefinitionRegistrars;
} }
public Map<String, Class<? extends BeanDefinitionReader>> getImportedResources() { Map<String, Class<? extends BeanDefinitionReader>> getImportedResources() {
return this.importedResources; return this.importedResources;
} }
public void validate(ProblemReporter problemReporter) { void validate(ProblemReporter problemReporter) {
// A configuration class may not be final (CGLIB limitation) unless it declares proxyBeanMethods=false // A configuration class may not be final (CGLIB limitation) unless it declares proxyBeanMethods=false
Map<String, Object> attributes = this.metadata.getAnnotationAttributes(Configuration.class.getName()); Map<String, Object> attributes = this.metadata.getAnnotationAttributes(Configuration.class.getName());
if (attributes != null && (Boolean) attributes.get("proxyBeanMethods")) { if (attributes != null && (Boolean) attributes.get("proxyBeanMethods")) {
@ -244,7 +244,7 @@ final class ConfigurationClass {
*/ */
private class FinalConfigurationProblem extends Problem { private class FinalConfigurationProblem extends Problem {
public FinalConfigurationProblem() { FinalConfigurationProblem() {
super(String.format("@Configuration class '%s' may not be final. Remove the final modifier to continue.", super(String.format("@Configuration class '%s' may not be final. Remove the final modifier to continue.",
getSimpleName()), new Location(getResource(), getMetadata())); getSimpleName()), new Location(getResource(), getMetadata()));
} }

6
spring-context/src/test/java/org/springframework/context/annotation/BeanMethodPolymorphismTests.java

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2019 the original author or authors. * Copyright 2002-2021 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -29,7 +29,7 @@ import static org.assertj.core.api.Assertions.assertThat;
/** /**
* Tests regarding overloading and overriding of bean methods. * Tests regarding overloading and overriding of bean methods.
* Related to SPR-6618. * <p>Related to SPR-6618.
* *
* @author Chris Beams * @author Chris Beams
* @author Phillip Webb * @author Phillip Webb
@ -41,7 +41,7 @@ public class BeanMethodPolymorphismTests {
@Test @Test
public void beanMethodDetectedOnSuperClass() { public void beanMethodDetectedOnSuperClass() {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(Config.class); AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(Config.class);
ctx.getBean("testBean", TestBean.class); assertThat(ctx.getBean("testBean", TestBean.class)).isNotNull();
} }
@Test @Test

6
spring-core/src/main/java/org/springframework/core/type/StandardAnnotationMetadata.java

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2020 the original author or authors. * Copyright 2002-2021 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -165,12 +165,12 @@ public class StandardAnnotationMetadata extends StandardClassMetadata implements
return annotatedMethods != null ? annotatedMethods : Collections.emptySet(); return annotatedMethods != null ? annotatedMethods : Collections.emptySet();
} }
private boolean isAnnotatedMethod(Method method, String annotationName) {
private static boolean isAnnotatedMethod(Method method, String annotationName) {
return !method.isBridge() && method.getAnnotations().length > 0 && return !method.isBridge() && method.getAnnotations().length > 0 &&
AnnotatedElementUtils.isAnnotated(method, annotationName); AnnotatedElementUtils.isAnnotated(method, annotationName);
} }
static AnnotationMetadata from(Class<?> introspectedClass) { static AnnotationMetadata from(Class<?> introspectedClass) {
return new StandardAnnotationMetadata(introspectedClass, true); return new StandardAnnotationMetadata(introspectedClass, true);
} }

38
spring-core/src/test/java/org/springframework/core/type/AbstractClassMetadataMemberClassTests.java

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2019 the original author or authors. * Copyright 2002-2021 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -20,7 +20,6 @@ import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
/** /**
* Abstract base class for testing implementations of * Abstract base class for testing implementations of
* {@link ClassMetadata#getMemberClassNames()}. * {@link ClassMetadata#getMemberClassNames()}.
@ -30,48 +29,45 @@ import static org.assertj.core.api.Assertions.assertThat;
*/ */
public abstract class AbstractClassMetadataMemberClassTests { public abstract class AbstractClassMetadataMemberClassTests {
public abstract ClassMetadata getClassMetadataFor(Class<?> clazz); protected abstract ClassMetadata getClassMetadataFor(Class<?> clazz);
@Test @Test
void withNoMemberClasses() { void withNoMemberClasses() {
ClassMetadata metadata = getClassMetadataFor(L0_a.class); ClassMetadata metadata = getClassMetadataFor(L0_a.class);
String[] nestedClasses = metadata.getMemberClassNames(); String[] nestedClasses = metadata.getMemberClassNames();
assertThat(nestedClasses).isEqualTo(new String[]{}); assertThat(nestedClasses).isEmpty();
}
public static class L0_a {
} }
@Test @Test
void withPublicMemberClasses() { void withPublicMemberClasses() {
ClassMetadata metadata = getClassMetadataFor(L0_b.class); ClassMetadata metadata = getClassMetadataFor(L0_b.class);
String[] nestedClasses = metadata.getMemberClassNames(); String[] nestedClasses = metadata.getMemberClassNames();
assertThat(nestedClasses).isEqualTo(new String[]{L0_b.L1.class.getName()}); assertThat(nestedClasses).containsOnly(L0_b.L1.class.getName());
} }
public static class L0_b {
public static class L1 { }
}
@Test @Test
void withNonPublicMemberClasses() { void withNonPublicMemberClasses() {
ClassMetadata metadata = getClassMetadataFor(L0_c.class); ClassMetadata metadata = getClassMetadataFor(L0_c.class);
String[] nestedClasses = metadata.getMemberClassNames(); String[] nestedClasses = metadata.getMemberClassNames();
assertThat(nestedClasses).isEqualTo(new String[]{L0_c.L1.class.getName()}); assertThat(nestedClasses).containsOnly(L0_c.L1.class.getName());
}
public static class L0_c {
private static class L1 { }
} }
@Test @Test
void againstMemberClass() { void againstMemberClass() {
ClassMetadata metadata = getClassMetadataFor(L0_b.L1.class); ClassMetadata metadata = getClassMetadataFor(L0_b.L1.class);
String[] nestedClasses = metadata.getMemberClassNames(); String[] nestedClasses = metadata.getMemberClassNames();
assertThat(nestedClasses).isEqualTo(new String[]{}); assertThat(nestedClasses).isEmpty();
}
public static class L0_a {
}
public static class L0_b {
public static class L1 { }
}
public static class L0_c {
private static class L1 { }
} }
} }

4
spring-core/src/test/java/org/springframework/core/type/classreading/AnnotationMetadataReadingVisitorTests.java

@ -65,8 +65,8 @@ class AnnotationMetadataReadingVisitorTests extends AbstractAnnotationMetadataTe
@Override @Override
@Test @Test
public void getAnnotationsReturnsDirectAnnotations() { public void getAnnotationsReturnsDirectAnnotations() {
assertThatExceptionOfType(UnsupportedOperationException.class).isThrownBy( assertThatExceptionOfType(UnsupportedOperationException.class)
super::getAnnotationsReturnsDirectAnnotations); .isThrownBy(super::getAnnotationsReturnsDirectAnnotations);
} }
} }

Loading…
Cancel
Save