Skip to content

Commit ca41473

Browse files
committed
Reinstate support for placeholders in @EntityScan
Fixes gh-25436
1 parent f85c7c9 commit ca41473

File tree

2 files changed

+37
-5
lines changed

2 files changed

+37
-5
lines changed

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/domain/EntityScanPackages.java

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import org.springframework.beans.factory.support.GenericBeanDefinition;
3333
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
3434
import org.springframework.core.annotation.AnnotationAttributes;
35+
import org.springframework.core.env.Environment;
3536
import org.springframework.core.type.AnnotationMetadata;
3637
import org.springframework.util.Assert;
3738
import org.springframework.util.ClassUtils;
@@ -124,6 +125,12 @@ public static void register(BeanDefinitionRegistry registry, Collection<String>
124125
*/
125126
static class Registrar implements ImportBeanDefinitionRegistrar {
126127

128+
private final Environment environment;
129+
130+
Registrar(Environment environment) {
131+
this.environment = environment;
132+
}
133+
127134
@Override
128135
public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
129136
register(registry, getPackagesToScan(metadata));
@@ -132,11 +139,12 @@ public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionR
132139
private Set<String> getPackagesToScan(AnnotationMetadata metadata) {
133140
AnnotationAttributes attributes = AnnotationAttributes
134141
.fromMap(metadata.getAnnotationAttributes(EntityScan.class.getName()));
135-
String[] basePackages = attributes.getStringArray("basePackages");
136-
Class<?>[] basePackageClasses = attributes.getClassArray("basePackageClasses");
137-
Set<String> packagesToScan = new LinkedHashSet<>(Arrays.asList(basePackages));
138-
for (Class<?> basePackageClass : basePackageClasses) {
139-
packagesToScan.add(ClassUtils.getPackageName(basePackageClass));
142+
Set<String> packagesToScan = new LinkedHashSet<>();
143+
for (String basePackage : attributes.getStringArray("basePackages")) {
144+
addResolvedPackage(basePackage, packagesToScan);
145+
}
146+
for (Class<?> basePackageClass : attributes.getClassArray("basePackageClasses")) {
147+
addResolvedPackage(ClassUtils.getPackageName(basePackageClass), packagesToScan);
140148
}
141149
if (packagesToScan.isEmpty()) {
142150
String packageName = ClassUtils.getPackageName(metadata.getClassName());
@@ -146,6 +154,10 @@ private Set<String> getPackagesToScan(AnnotationMetadata metadata) {
146154
return packagesToScan;
147155
}
148156

157+
private void addResolvedPackage(String packageName, Set<String> packagesToScan) {
158+
packagesToScan.add(this.environment.resolvePlaceholders(packageName));
159+
}
160+
149161
}
150162

151163
static class EntityScanPackagesBeanDefinition extends GenericBeanDefinition {

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/domain/EntityScannerTests.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import org.springframework.boot.autoconfigure.domain.scan.b.EntityB;
3232
import org.springframework.boot.autoconfigure.domain.scan.c.EmbeddableC;
3333
import org.springframework.boot.autoconfigure.domain.scan.c.EntityC;
34+
import org.springframework.boot.test.util.TestPropertyValues;
3435
import org.springframework.context.ApplicationContext;
3536
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
3637
import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider;
@@ -66,6 +67,19 @@ void scanShouldScanFromSinglePackage() throws Exception {
6667
context.close();
6768
}
6869

70+
@Test
71+
void scanShouldScanFromResolvedPlaceholderPackage() throws Exception {
72+
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
73+
TestPropertyValues.of("com.example.entity-package=org.springframework.boot.autoconfigure.domain.scan")
74+
.applyTo(context);
75+
context.register(ScanPlaceholderConfig.class);
76+
context.refresh();
77+
EntityScanner scanner = new EntityScanner(context);
78+
Set<Class<?>> scanned = scanner.scan(Entity.class);
79+
assertThat(scanned).containsOnly(EntityA.class, EntityB.class, EntityC.class);
80+
context.close();
81+
}
82+
6983
@Test
7084
void scanShouldScanFromMultiplePackages() throws Exception {
7185
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ScanAConfig.class,
@@ -141,4 +155,10 @@ static class ScanBConfig {
141155

142156
}
143157

158+
@Configuration(proxyBeanMethods = false)
159+
@EntityScan("${com.example.entity-package}")
160+
static class ScanPlaceholderConfig {
161+
162+
}
163+
144164
}

0 commit comments

Comments
 (0)