Skip to content

Commit 56af156

Browse files
committed
Refine @ImportTestcontainers support
Refine logic so that bean names are no longer generated based on their type and containers are started early. See gh-35245
1 parent 1143396 commit 56af156

File tree

3 files changed

+17
-14
lines changed

3 files changed

+17
-14
lines changed

spring-boot-project/spring-boot-testcontainers/src/main/java/org/springframework/boot/testcontainers/context/ContainerFieldsImporter.java

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,9 @@
2222
import java.util.List;
2323

2424
import org.testcontainers.containers.Container;
25+
import org.testcontainers.lifecycle.Startable;
2526

2627
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
27-
import org.springframework.beans.factory.support.BeanNameGenerator;
2828
import org.springframework.util.Assert;
2929
import org.springframework.util.ReflectionUtils;
3030

@@ -35,12 +35,14 @@
3535
*/
3636
class ContainerFieldsImporter {
3737

38-
void registerBeanDefinitions(BeanDefinitionRegistry registry, BeanNameGenerator importBeanNameGenerator,
39-
Class<?> definitionClass) {
38+
void registerBeanDefinitions(BeanDefinitionRegistry registry, Class<?> definitionClass) {
4039
for (Field field : getContainerFields(definitionClass)) {
4140
assertValid(field);
4241
Container<?> container = getContainer(field);
43-
registerBeanDefinition(registry, importBeanNameGenerator, field, container);
42+
if (container instanceof Startable startable) {
43+
startable.start();
44+
}
45+
registerBeanDefinition(registry, field, container);
4446
}
4547
}
4648

@@ -66,11 +68,14 @@ private Container<?> getContainer(Field field) {
6668
return container;
6769
}
6870

69-
private void registerBeanDefinition(BeanDefinitionRegistry registry, BeanNameGenerator importBeanNameGenerator,
70-
Field field, Container<?> container) {
71+
private void registerBeanDefinition(BeanDefinitionRegistry registry, Field field, Container<?> container) {
7172
TestcontainerFieldBeanDefinition beanDefinition = new TestcontainerFieldBeanDefinition(field, container);
72-
String beanName = importBeanNameGenerator.generateBeanName(beanDefinition, registry);
73+
String beanName = generateBeanName(field);
7374
registry.registerBeanDefinition(beanName, beanDefinition);
7475
}
7576

77+
private String generateBeanName(Field field) {
78+
return "importTestContainer.%s.%s".formatted(field.getDeclaringClass().getName(), field.getName());
79+
}
80+
7681
}

spring-boot-project/spring-boot-testcontainers/src/main/java/org/springframework/boot/testcontainers/context/ImportTestcontainersRegistrar.java

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
package org.springframework.boot.testcontainers.context;
1818

1919
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
20-
import org.springframework.beans.factory.support.BeanNameGenerator;
2120
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
2221
import org.springframework.core.annotation.MergedAnnotation;
2322
import org.springframework.core.env.Environment;
@@ -48,22 +47,20 @@ class ImportTestcontainersRegistrar implements ImportBeanDefinitionRegistrar {
4847
}
4948

5049
@Override
51-
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry,
52-
BeanNameGenerator importBeanNameGenerator) {
50+
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
5351
MergedAnnotation<ImportTestcontainers> annotation = importingClassMetadata.getAnnotations()
5452
.get(ImportTestcontainers.class);
5553
Class<?>[] definitionClasses = annotation.getClassArray(MergedAnnotation.VALUE);
5654
if (ObjectUtils.isEmpty(definitionClasses)) {
5755
Class<?> importingClass = ClassUtils.resolveClassName(importingClassMetadata.getClassName(), null);
5856
definitionClasses = new Class<?>[] { importingClass };
5957
}
60-
registerBeanDefinitions(registry, importBeanNameGenerator, definitionClasses);
58+
registerBeanDefinitions(registry, definitionClasses);
6159
}
6260

63-
private void registerBeanDefinitions(BeanDefinitionRegistry registry, BeanNameGenerator importBeanNameGenerator,
64-
Class<?>[] definitionClasses) {
61+
private void registerBeanDefinitions(BeanDefinitionRegistry registry, Class<?>[] definitionClasses) {
6562
for (Class<?> definitionClass : definitionClasses) {
66-
this.containerFieldsImporter.registerBeanDefinitions(registry, importBeanNameGenerator, definitionClass);
63+
this.containerFieldsImporter.registerBeanDefinitions(registry, definitionClass);
6764
if (this.dynamicPropertySourceMethodsImporter != null) {
6865
this.dynamicPropertySourceMethodsImporter.registerDynamicPropertySources(definitionClass);
6966
}

spring-boot-project/spring-boot-testcontainers/src/main/java/org/springframework/boot/testcontainers/context/TestcontainerFieldBeanDefinition.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ class TestcontainerFieldBeanDefinition extends RootBeanDefinition implements Tes
4040
this.annotations = MergedAnnotations.from(field);
4141
this.setBeanClass(container.getClass());
4242
setInstanceSupplier(() -> container);
43+
setRole(ROLE_INFRASTRUCTURE);
4344
}
4445

4546
@Override

0 commit comments

Comments
 (0)