parent
df6feb3e2a
commit
f780179777
|
|
@ -23,20 +23,20 @@ import java.util.Map;
|
|||
import java.util.Set;
|
||||
|
||||
import org.springframework.beans.factory.config.BeanDefinition;
|
||||
import org.springframework.boot.SpringBootConfiguration;
|
||||
import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider;
|
||||
import org.springframework.core.type.filter.AnnotationTypeFilter;
|
||||
import org.springframework.util.Assert;
|
||||
import org.springframework.util.ClassUtils;
|
||||
|
||||
/**
|
||||
* Utility class to scan for a {@link SpringBootConfiguration} or custom annotation.
|
||||
* Utility class to find a class annotated with a particular annotation in a hierarchy.
|
||||
*
|
||||
* @author Phillip Webb
|
||||
* @author Artsiom Yudovin
|
||||
* @author Stephane Nicoll
|
||||
* @since 2.1.0
|
||||
*/
|
||||
public final class SpringBootConfigurationFinder {
|
||||
public final class AnnotatedClassFinder {
|
||||
|
||||
private static final Map<String, Class<?>> cache = Collections
|
||||
.synchronizedMap(new Cache(40));
|
||||
|
|
@ -44,28 +44,35 @@ public final class SpringBootConfigurationFinder {
|
|||
private final ClassPathScanningCandidateComponentProvider scanner;
|
||||
|
||||
/**
|
||||
* Default constructor initializing finder to scan for a {@link SpringBootConfiguration} annotation.
|
||||
* Create a new instance with the {@code annotationType} to find.
|
||||
* @param annotationType the annotation to find
|
||||
*/
|
||||
public SpringBootConfigurationFinder() {
|
||||
this(SpringBootConfiguration.class);
|
||||
}
|
||||
|
||||
/**
|
||||
* Customiable constructor allow to provide the custom annotation to scan for.
|
||||
* @param annotationType Annotation to scan for.
|
||||
*/
|
||||
public SpringBootConfigurationFinder(Class<? extends Annotation> annotationType) {
|
||||
public AnnotatedClassFinder(Class<? extends Annotation> annotationType) {
|
||||
Assert.notNull(annotationType, "AnnotationType must not be null");
|
||||
this.scanner = new ClassPathScanningCandidateComponentProvider(false);
|
||||
this.scanner.addIncludeFilter(
|
||||
new AnnotationTypeFilter(annotationType));
|
||||
this.scanner.addIncludeFilter(new AnnotationTypeFilter(annotationType));
|
||||
this.scanner.setResourcePattern("*.class");
|
||||
}
|
||||
|
||||
/**
|
||||
* Find the first {@link Class} that is annotated with the target annotation, starting
|
||||
* from the package defined by the given {@code source} up to the root.
|
||||
* @param source the source class to use to initiate the search
|
||||
* @return the first {@link Class} annotated with the target annotation within the
|
||||
* hierarchy defined by the given {@code source} or {@code null} if none is found.
|
||||
*/
|
||||
public Class<?> findFromClass(Class<?> source) {
|
||||
Assert.notNull(source, "Source must not be null");
|
||||
return findFromPackage(ClassUtils.getPackageName(source));
|
||||
}
|
||||
|
||||
/**
|
||||
* Find the first {@link Class} that is annotated with the target annotation, starting
|
||||
* from the package defined by the given {@code source} up to the root.
|
||||
* @param source the source package to use to initiate the search
|
||||
* @return the first {@link Class} annotated with the target annotation within the
|
||||
* hierarchy defined by the given {@code source} or {@code null} if none is found.
|
||||
*/
|
||||
public Class<?> findFromPackage(String source) {
|
||||
Assert.notNull(source, "Source must not be null");
|
||||
Class<?> configuration = cache.get(source);
|
||||
|
|
@ -238,7 +238,7 @@ public class SpringBootTestContextBootstrapper extends DefaultTestContextBootstr
|
|||
if (containsNonTestComponent(classes) || mergedConfig.hasLocations()) {
|
||||
return classes;
|
||||
}
|
||||
Class<?> found = new SpringBootConfigurationFinder()
|
||||
Class<?> found = new AnnotatedClassFinder(SpringBootConfiguration.class)
|
||||
.findFromClass(mergedConfig.getTestClass());
|
||||
Assert.state(found != null,
|
||||
"Unable to find a @SpringBootConfiguration, you need to use "
|
||||
|
|
|
|||
|
|
@ -20,22 +20,24 @@ import org.junit.Rule;
|
|||
import org.junit.Test;
|
||||
import org.junit.rules.ExpectedException;
|
||||
|
||||
import org.springframework.boot.SpringBootConfiguration;
|
||||
import org.springframework.boot.test.context.example.ExampleConfig;
|
||||
import org.springframework.boot.test.context.example.scan.Example;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
/**
|
||||
* Tests for {@link SpringBootConfigurationFinder}.
|
||||
* Tests for {@link AnnotatedClassFinder}.
|
||||
*
|
||||
* @author Phillip Webb
|
||||
*/
|
||||
public class SpringBootConfigurationFinderTests {
|
||||
public class AnnotatedClassFinderTests {
|
||||
|
||||
@Rule
|
||||
public ExpectedException thrown = ExpectedException.none();
|
||||
|
||||
private SpringBootConfigurationFinder finder = new SpringBootConfigurationFinder();
|
||||
private AnnotatedClassFinder finder = new AnnotatedClassFinder(
|
||||
SpringBootConfiguration.class);
|
||||
|
||||
@Test
|
||||
public void findFromClassWhenSourceIsNullShouldThrowException() {
|
||||
|
|
@ -17,10 +17,10 @@
|
|||
package org.springframework.boot.test.context.example;
|
||||
|
||||
import org.springframework.boot.SpringBootConfiguration;
|
||||
import org.springframework.boot.test.context.SpringBootConfigurationFinderTests;
|
||||
import org.springframework.boot.test.context.AnnotatedClassFinderTests;
|
||||
|
||||
/**
|
||||
* Example config used in {@link SpringBootConfigurationFinderTests}.
|
||||
* Example config used in {@link AnnotatedClassFinderTests}.
|
||||
*
|
||||
* @author Phillip Webb
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -16,10 +16,10 @@
|
|||
|
||||
package org.springframework.boot.test.context.example.scan;
|
||||
|
||||
import org.springframework.boot.test.context.SpringBootConfigurationFinderTests;
|
||||
import org.springframework.boot.test.context.AnnotatedClassFinderTests;
|
||||
|
||||
/**
|
||||
* Example class used in {@link SpringBootConfigurationFinderTests}.
|
||||
* Example class used in {@link AnnotatedClassFinderTests}.
|
||||
*
|
||||
* @author Phillip Webb
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -17,11 +17,11 @@
|
|||
package org.springframework.boot.test.context.example.scan.sub;
|
||||
|
||||
import org.springframework.boot.SpringBootConfiguration;
|
||||
import org.springframework.boot.test.context.SpringBootConfigurationFinderTests;
|
||||
import org.springframework.boot.test.context.AnnotatedClassFinderTests;
|
||||
|
||||
/**
|
||||
* Example config used in {@link SpringBootConfigurationFinderTests}. Should not be found
|
||||
* since scanner should only search upwards.
|
||||
* Example config used in {@link AnnotatedClassFinderTests}. Should not be found since
|
||||
* scanner should only search upwards.
|
||||
*
|
||||
* @author Phillip Webb
|
||||
*/
|
||||
|
|
|
|||
Loading…
Reference in New Issue