Allow customization of MongoClientSettings.Builder

MongoClientSettingsBuilderCustomizer allows customization of the
auto-configured `MongoClientSettings.Builder`.

See gh-9341
pull/9370/head
Mark Paluch 8 years ago committed by Stephane Nicoll
parent 4a605f6270
commit eeb961075f

@ -0,0 +1,38 @@
/*
* Copyright 2012-2017 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.boot.autoconfigure.mongo;
import com.mongodb.async.client.MongoClientSettings.Builder;
/**
* Callback interface that can be implemented by beans wishing to customize the
* {@link com.mongodb.async.client.MongoClientSettings} via a {@link Builder
* MongoClientSettings.Builder} whilst retaining default auto-configuration.
*
* @author Mark Paluch
* @since 2.0.0
*/
@FunctionalInterface
public interface MongoClientSettingsBuilderCustomizer {
/**
* Customize the {@link Builder}.
* @param settingsBuilder the builder to customize
*/
void customize(Builder settingsBuilder);
}

@ -16,6 +16,8 @@
package org.springframework.boot.autoconfigure.mongo;
import java.util.List;
import javax.annotation.PreDestroy;
import com.mongodb.async.client.MongoClientSettings;
@ -49,9 +51,11 @@ public class MongoReactiveAutoConfiguration {
private MongoClient mongo;
public MongoReactiveAutoConfiguration(MongoProperties properties,
ObjectProvider<MongoClientSettings> settings, Environment environment) {
ObjectProvider<MongoClientSettings> settings, Environment environment,
ObjectProvider<List<MongoClientSettingsBuilderCustomizer>> builderCustomizers) {
this.settings = settings.getIfAvailable();
this.factory = new ReactiveMongoClientFactory(properties, environment);
this.factory = new ReactiveMongoClientFactory(properties, environment,
builderCustomizers.getIfAvailable());
}
@PreDestroy

@ -48,10 +48,13 @@ public class ReactiveMongoClientFactory {
private final Environment environment;
public ReactiveMongoClientFactory(MongoProperties properties,
Environment environment) {
private final List<MongoClientSettingsBuilderCustomizer> builderCustomizers;
public ReactiveMongoClientFactory(MongoProperties properties, Environment environment,
List<MongoClientSettingsBuilderCustomizer> builderCustomizers) {
this.properties = properties;
this.environment = environment;
this.builderCustomizers = builderCustomizers;
}
/**
@ -149,9 +152,18 @@ public class ReactiveMongoClientFactory {
if (connectionString.getApplicationName() != null) {
builder.applicationName(connectionString.getApplicationName());
}
customize(builder);
return builder;
}
private void customize(MongoClientSettings.Builder builder) {
if (this.builderCustomizers != null) {
for (MongoClientSettingsBuilderCustomizer customizer : this.builderCustomizers) {
customizer.customize(builder);
}
}
}
private boolean hasCustomAddress() {
return this.properties.getHost() != null || this.properties.getPort() != null;
}

@ -20,6 +20,7 @@ import java.util.concurrent.TimeUnit;
import com.mongodb.ReadPreference;
import com.mongodb.async.client.MongoClientSettings;
import com.mongodb.async.client.MongoClientSettings.Builder;
import com.mongodb.connection.SocketSettings;
import com.mongodb.connection.StreamFactory;
import com.mongodb.connection.StreamFactoryFactory;
@ -37,6 +38,7 @@ import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.BDDMockito.given;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
/**
* Tests for {@link MongoReactiveAutoConfiguration}.
@ -106,6 +108,37 @@ public class MongoReactiveAutoConfigurationTests {
.isSameAs(this.context.getBean("myStreamFactoryFactory"));
}
@Test
public void customizerGetsInvoked() {
this.context = new AnnotationConfigApplicationContext();
TestPropertyValues.of(
"spring.data.mongodb.uri:mongodb://localhost/test").applyTo(this.context);
this.context.register(PropertyPlaceholderAutoConfiguration.class,
MongoReactiveAutoConfiguration.class, MockCustomizerConfig.class);
this.context.refresh();
assertThat(this.context.getBeanNamesForType(MongoClient.class).length)
.isEqualTo(1);
MongoClientSettingsBuilderCustomizer customizer = this.context
.getBean(MongoClientSettingsBuilderCustomizer.class);
verify(customizer).customize(any(Builder.class));
}
@Test
public void customizerOverridesAutoConfig() {
this.context = new AnnotationConfigApplicationContext();
TestPropertyValues
.of("spring.data.mongodb.uri:mongodb://localhost/test?appname=auto-config")
.applyTo(this.context);
this.context.register(PropertyPlaceholderAutoConfiguration.class,
MongoReactiveAutoConfiguration.class, SimpleCustomizerConfig.class);
this.context.refresh();
assertThat(this.context.getBeanNamesForType(MongoClient.class).length)
.isEqualTo(1);
MongoClient client = this.context.getBean(MongoClient.class);
assertThat(client.getSettings().getApplicationName())
.isEqualTo("overridden-name");
}
@Configuration
static class OptionsConfig {
@ -138,4 +171,29 @@ public class MongoReactiveAutoConfigurationTests {
}
@Configuration
static class MockCustomizerConfig {
@Bean
public MongoClientSettingsBuilderCustomizer customizer() {
return mock(MongoClientSettingsBuilderCustomizer.class);
}
}
@Configuration
static class SimpleCustomizerConfig {
@Bean
public MongoClientSettingsBuilderCustomizer customizer() {
return new MongoClientSettingsBuilderCustomizer() {
@Override
public void customize(MongoClientSettings.Builder settingsBuilder) {
settingsBuilder.applicationName("overridden-name");
}
};
}
}
}

@ -154,7 +154,7 @@ public class ReactiveMongoClientFactoryTests {
private MongoClient createMongoClient(MongoProperties properties,
Environment environment) {
return new ReactiveMongoClientFactory(properties, environment)
return new ReactiveMongoClientFactory(properties, environment, null)
.createMongoClient(null);
}

Loading…
Cancel
Save