Skip to content

Commit 39f1039

Browse files
ielatifwilkinsona
authored andcommitted
Set up MongoClient beans' dependencies by type rather than name
See gh-16627
1 parent 1678de7 commit 39f1039

File tree

2 files changed

+41
-11
lines changed

2 files changed

+41
-11
lines changed

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mongo/embedded/EmbeddedMongoAutoConfiguration.java

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@
4848
import org.slf4j.Logger;
4949
import org.slf4j.LoggerFactory;
5050

51+
import org.springframework.beans.factory.BeanFactoryUtils;
52+
import org.springframework.beans.factory.ListableBeanFactory;
5153
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
5254
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
5355
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
@@ -74,6 +76,7 @@
7476
* @author Andy Wilkinson
7577
* @author Yogesh Lonkar
7678
* @author Mark Paluch
79+
* @author Issam El-atif
7780
* @since 1.3.0
7881
*/
7982
@Configuration
@@ -210,30 +213,37 @@ private ArtifactStoreBuilder getArtifactStore(Logger logger) {
210213
}
211214

212215
/**
213-
* Additional configuration to ensure that {@link MongoClient} beans depend on the
214-
* {@code embeddedMongoServer} bean.
216+
* Additional configuration to ensure that {@link MongoClient} beans depend on any
217+
* {@link MongodExecutable} beans.
215218
*/
216219
@Configuration
217220
@ConditionalOnClass({ MongoClient.class, MongoClientFactoryBean.class })
218-
protected static class EmbeddedMongoDependencyConfiguration extends MongoClientDependsOnBeanFactoryPostProcessor {
221+
protected static class EmbeddedMongoDependencyConfiguration {
219222

220-
public EmbeddedMongoDependencyConfiguration() {
221-
super("embeddedMongoServer");
223+
@Bean
224+
public MongoClientDependsOnBeanFactoryPostProcessor mongoClientDependsOnBeanFactoryPostProcessor(
225+
ListableBeanFactory listableBeanFactory) {
226+
String[] mongoExecutableBeanNames = BeanFactoryUtils.beanNamesForTypeIncludingAncestors(listableBeanFactory,
227+
MongodExecutable.class);
228+
return new MongoClientDependsOnBeanFactoryPostProcessor(mongoExecutableBeanNames);
222229
}
223230

224231
}
225232

226233
/**
227-
* Additional configuration to ensure that {@link MongoClient} beans depend on the
228-
* {@code embeddedMongoServer} bean.
234+
* Additional configuration to ensure that {@link MongoClient} beans depend on any
235+
* {@link MongodExecutable} beans.
229236
*/
230237
@Configuration
231238
@ConditionalOnClass({ com.mongodb.reactivestreams.client.MongoClient.class, ReactiveMongoClientFactoryBean.class })
232-
protected static class EmbeddedReactiveMongoDependencyConfiguration
233-
extends ReactiveStreamsMongoClientDependsOnBeanFactoryPostProcessor {
239+
protected static class EmbeddedReactiveMongoDependencyConfiguration {
234240

235-
public EmbeddedReactiveMongoDependencyConfiguration() {
236-
super("embeddedMongoServer");
241+
@Bean
242+
public ReactiveStreamsMongoClientDependsOnBeanFactoryPostProcessor reactiveStreamsMongoClientDependsOnBeanFactoryPostProcessor(
243+
ListableBeanFactory listableBeanFactory) {
244+
String[] mongoExecutableBeanNames = BeanFactoryUtils.beanNamesForTypeIncludingAncestors(listableBeanFactory,
245+
MongodExecutable.class);
246+
return new ReactiveStreamsMongoClientDependsOnBeanFactoryPostProcessor(mongoExecutableBeanNames);
237247
}
238248

239249
}

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/mongo/embedded/EmbeddedMongoAutoConfigurationTests.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,12 @@
2222

2323
import com.mongodb.MongoClient;
2424
import de.flapdoodle.embed.mongo.MongodExecutable;
25+
import de.flapdoodle.embed.mongo.MongodStarter;
2526
import de.flapdoodle.embed.mongo.config.IMongodConfig;
2627
import de.flapdoodle.embed.mongo.config.Storage;
2728
import de.flapdoodle.embed.mongo.distribution.Feature;
2829
import de.flapdoodle.embed.mongo.distribution.Version;
30+
import de.flapdoodle.embed.process.config.IRuntimeConfig;
2931
import org.bson.Document;
3032
import org.junit.After;
3133
import org.junit.Test;
@@ -43,13 +45,15 @@
4345
import org.springframework.util.FileSystemUtils;
4446

4547
import static org.assertj.core.api.Assertions.assertThat;
48+
import static org.assertj.core.api.Assertions.assertThatCode;
4649

4750
/**
4851
* Tests for {@link EmbeddedMongoAutoConfiguration}.
4952
*
5053
* @author Henryk Konsek
5154
* @author Andy Wilkinson
5255
* @author Stephane Nicoll
56+
* @author Issam El-atif
5357
*/
5458
public class EmbeddedMongoAutoConfigurationTests {
5559

@@ -171,6 +175,11 @@ public void shutdownHookIsNotRegistered() {
171175
assertThat(this.context.getBean(MongodExecutable.class).isRegisteredJobKiller()).isFalse();
172176
}
173177

178+
@Test
179+
public void customMongoServerConfiguration() {
180+
assertThatCode(() -> load(CustomMongoConfiguration.class)).doesNotThrowAnyException();
181+
}
182+
174183
private void assertVersionConfiguration(String configuredVersion, String expectedVersion) {
175184
this.context = new AnnotationConfigApplicationContext();
176185
TestPropertyValues.of("spring.data.mongodb.port=0").applyTo(this.context);
@@ -216,4 +225,15 @@ public MongoClient mongoClient(@Value("${local.mongo.port}") int port) {
216225

217226
}
218227

228+
@Configuration
229+
static class CustomMongoConfiguration {
230+
231+
@Bean(initMethod = "start", destroyMethod = "stop")
232+
public MongodExecutable customMongoServer(IRuntimeConfig runtimeConfig, IMongodConfig mongodConfig) {
233+
MongodStarter mongodStarter = MongodStarter.getInstance(runtimeConfig);
234+
return mongodStarter.prepare(mongodConfig);
235+
}
236+
237+
}
238+
219239
}

0 commit comments

Comments
 (0)