Skip to content

Commit

Permalink
Reinstate support for placeholders in @EntityScan
Browse files Browse the repository at this point in the history
Fixes gh-25436
  • Loading branch information
wilkinsona committed Mar 4, 2021
1 parent f85c7c9 commit ca41473
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
import org.springframework.beans.factory.support.GenericBeanDefinition;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.annotation.AnnotationAttributes;
import org.springframework.core.env.Environment;
import org.springframework.core.type.AnnotationMetadata;
import org.springframework.util.Assert;
import org.springframework.util.ClassUtils;
Expand Down Expand Up @@ -124,6 +125,12 @@ public static void register(BeanDefinitionRegistry registry, Collection<String>
*/
static class Registrar implements ImportBeanDefinitionRegistrar {

private final Environment environment;

Registrar(Environment environment) {
this.environment = environment;
}

@Override
public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
register(registry, getPackagesToScan(metadata));
Expand All @@ -132,11 +139,12 @@ public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionR
private Set<String> getPackagesToScan(AnnotationMetadata metadata) {
AnnotationAttributes attributes = AnnotationAttributes
.fromMap(metadata.getAnnotationAttributes(EntityScan.class.getName()));
String[] basePackages = attributes.getStringArray("basePackages");
Class<?>[] basePackageClasses = attributes.getClassArray("basePackageClasses");
Set<String> packagesToScan = new LinkedHashSet<>(Arrays.asList(basePackages));
for (Class<?> basePackageClass : basePackageClasses) {
packagesToScan.add(ClassUtils.getPackageName(basePackageClass));
Set<String> packagesToScan = new LinkedHashSet<>();
for (String basePackage : attributes.getStringArray("basePackages")) {
addResolvedPackage(basePackage, packagesToScan);
}
for (Class<?> basePackageClass : attributes.getClassArray("basePackageClasses")) {
addResolvedPackage(ClassUtils.getPackageName(basePackageClass), packagesToScan);
}
if (packagesToScan.isEmpty()) {
String packageName = ClassUtils.getPackageName(metadata.getClassName());
Expand All @@ -146,6 +154,10 @@ private Set<String> getPackagesToScan(AnnotationMetadata metadata) {
return packagesToScan;
}

private void addResolvedPackage(String packageName, Set<String> packagesToScan) {
packagesToScan.add(this.environment.resolvePlaceholders(packageName));
}

}

static class EntityScanPackagesBeanDefinition extends GenericBeanDefinition {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
import org.springframework.boot.autoconfigure.domain.scan.b.EntityB;
import org.springframework.boot.autoconfigure.domain.scan.c.EmbeddableC;
import org.springframework.boot.autoconfigure.domain.scan.c.EntityC;
import org.springframework.boot.test.util.TestPropertyValues;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider;
Expand Down Expand Up @@ -66,6 +67,19 @@ void scanShouldScanFromSinglePackage() throws Exception {
context.close();
}

@Test
void scanShouldScanFromResolvedPlaceholderPackage() throws Exception {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
TestPropertyValues.of("com.example.entity-package=org.springframework.boot.autoconfigure.domain.scan")
.applyTo(context);
context.register(ScanPlaceholderConfig.class);
context.refresh();
EntityScanner scanner = new EntityScanner(context);
Set<Class<?>> scanned = scanner.scan(Entity.class);
assertThat(scanned).containsOnly(EntityA.class, EntityB.class, EntityC.class);
context.close();
}

@Test
void scanShouldScanFromMultiplePackages() throws Exception {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ScanAConfig.class,
Expand Down Expand Up @@ -141,4 +155,10 @@ static class ScanBConfig {

}

@Configuration(proxyBeanMethods = false)
@EntityScan("${com.example.entity-package}")
static class ScanPlaceholderConfig {

}

}

0 comments on commit ca41473

Please sign in to comment.