mirror of
https://github.com/spring-projects/spring-boot.git
synced 2024-08-29 03:06:45 +08:00
Merge branch '3.1.x'
Closes gh-36210
This commit is contained in:
commit
b2985676aa
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2012-2022 the original author or authors.
|
||||
* Copyright 2012-2023 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.
|
||||
@ -43,6 +43,9 @@ import org.springframework.context.annotation.ImportSelector;
|
||||
import org.springframework.context.support.AbstractApplicationContext;
|
||||
import org.springframework.core.Ordered;
|
||||
import org.springframework.core.annotation.AnnotationUtils;
|
||||
import org.springframework.core.annotation.MergedAnnotation;
|
||||
import org.springframework.core.annotation.MergedAnnotations;
|
||||
import org.springframework.core.annotation.MergedAnnotations.SearchStrategy;
|
||||
import org.springframework.core.annotation.Order;
|
||||
import org.springframework.core.style.ToStringCreator;
|
||||
import org.springframework.core.type.AnnotationMetadata;
|
||||
@ -251,7 +254,9 @@ class ImportsContextCustomizer implements ContextCustomizer {
|
||||
|
||||
private void collectElementAnnotations(AnnotatedElement element, Set<Annotation> annotations,
|
||||
Set<Class<?>> seen) {
|
||||
for (Annotation annotation : element.getDeclaredAnnotations()) {
|
||||
for (MergedAnnotation<Annotation> mergedAnnotation : MergedAnnotations.from(element,
|
||||
SearchStrategy.DIRECT)) {
|
||||
Annotation annotation = mergedAnnotation.synthesize();
|
||||
if (!isIgnoredAnnotation(annotation)) {
|
||||
annotations.add(annotation);
|
||||
collectClassAnnotations(annotation.annotationType(), annotations, seen);
|
||||
|
@ -33,6 +33,7 @@ import org.springframework.boot.context.annotation.DeterminableImports;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.context.annotation.Import;
|
||||
import org.springframework.context.annotation.ImportSelector;
|
||||
import org.springframework.core.annotation.AliasFor;
|
||||
import org.springframework.core.type.AnnotationMetadata;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
@ -41,6 +42,7 @@ import static org.assertj.core.api.Assertions.assertThat;
|
||||
* Tests for {@link ImportsContextCustomizer}.
|
||||
*
|
||||
* @author Andy Wilkinson
|
||||
* @author Laurent Martelli
|
||||
*/
|
||||
class ImportsContextCustomizerTests {
|
||||
|
||||
@ -80,6 +82,30 @@ class ImportsContextCustomizerTests {
|
||||
.isEqualTo(new ImportsContextCustomizer(SecondJUnitAnnotatedTestClass.class));
|
||||
}
|
||||
|
||||
@Test
|
||||
void customizersForClassesWithDifferentImportsAreNotEqual() {
|
||||
assertThat(new ImportsContextCustomizer(FirstAnnotatedTestClass.class))
|
||||
.isNotEqualTo(new ImportsContextCustomizer(SecondAnnotatedTestClass.class));
|
||||
}
|
||||
|
||||
@Test
|
||||
void customizersForClassesWithDifferentMetaImportsAreNotEqual() {
|
||||
assertThat(new ImportsContextCustomizer(FirstMetaAnnotatedTestClass.class))
|
||||
.isNotEqualTo(new ImportsContextCustomizer(SecondMetaAnnotatedTestClass.class));
|
||||
}
|
||||
|
||||
@Test
|
||||
void customizersForClassesWithDifferentAliasedImportsAreNotEqual() {
|
||||
assertThat(new ImportsContextCustomizer(FirstAliasAnnotatedTestClass.class))
|
||||
.isNotEqualTo(new ImportsContextCustomizer(SecondAliasAnnotatedTestClass.class));
|
||||
}
|
||||
|
||||
@Test
|
||||
void importsCanBeScatteredOnMultipleAnnotations() {
|
||||
assertThat(new ImportsContextCustomizer(SingleImportAnnotationTestClass.class))
|
||||
.isEqualTo(new ImportsContextCustomizer(MultipleImportAnnotationTestClass.class));
|
||||
}
|
||||
|
||||
@Import(TestImportSelector.class)
|
||||
@Indicator1
|
||||
static class FirstImportSelectorAnnotatedClass {
|
||||
@ -152,6 +178,17 @@ class ImportsContextCustomizerTests {
|
||||
|
||||
}
|
||||
|
||||
@Import({ FirstImportedClass.class, SecondImportedClass.class })
|
||||
static class SingleImportAnnotationTestClass {
|
||||
|
||||
}
|
||||
|
||||
@FirstMetaImport
|
||||
@Import(SecondImportedClass.class)
|
||||
static class MultipleImportAnnotationTestClass {
|
||||
|
||||
}
|
||||
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@interface Indicator1 {
|
||||
|
||||
@ -162,6 +199,65 @@ class ImportsContextCustomizerTests {
|
||||
|
||||
}
|
||||
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Import(AliasFor.class)
|
||||
public @interface AliasedImport {
|
||||
|
||||
@AliasFor(annotation = Import.class)
|
||||
Class<?>[] value();
|
||||
|
||||
}
|
||||
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Import(FirstImportedClass.class)
|
||||
public @interface FirstMetaImport {
|
||||
|
||||
}
|
||||
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Import(SecondImportedClass.class)
|
||||
public @interface SecondMetaImport {
|
||||
|
||||
}
|
||||
|
||||
static class FirstImportedClass {
|
||||
|
||||
}
|
||||
|
||||
static class SecondImportedClass {
|
||||
|
||||
}
|
||||
|
||||
@AliasedImport(FirstImportedClass.class)
|
||||
static class FirstAliasAnnotatedTestClass {
|
||||
|
||||
}
|
||||
|
||||
@AliasedImport(SecondImportedClass.class)
|
||||
static class SecondAliasAnnotatedTestClass {
|
||||
|
||||
}
|
||||
|
||||
@FirstMetaImport
|
||||
static class FirstMetaAnnotatedTestClass {
|
||||
|
||||
}
|
||||
|
||||
@SecondMetaImport
|
||||
static class SecondMetaAnnotatedTestClass {
|
||||
|
||||
}
|
||||
|
||||
@Import(FirstImportedClass.class)
|
||||
static class FirstAnnotatedTestClass {
|
||||
|
||||
}
|
||||
|
||||
@Import(SecondImportedClass.class)
|
||||
static class SecondAnnotatedTestClass {
|
||||
|
||||
}
|
||||
|
||||
static class TestImportSelector implements ImportSelector {
|
||||
|
||||
@Override
|
||||
|
Loading…
Reference in New Issue
Block a user