From df43d7fcdb7c2bedf1d2265ed12206232267e0d2 Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Tue, 10 Mar 2020 14:17:37 +0100 Subject: [PATCH] =?UTF-8?q?DATAMONGO-2355=20-=20Refactor=20Abstract?= =?UTF-8?q?=E2=80=A6Configuration=20classes=20to=20avoid=20need=20for=20cg?= =?UTF-8?q?lib=20proxies.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Configuration methods now use parameter injections to avoid the need for cglib subclassing. --- .../AbstractMongoClientConfiguration.java | 32 +++++++++---------- .../AbstractReactiveMongoConfiguration.java | 27 +++++++++------- .../config/MongoConfigurationSupport.java | 7 ++-- .../AbstractMongoConfigurationUnitTests.java | 10 +++--- ...ctReactiveMongoConfigurationUnitTests.java | 10 +++--- .../mongodb/core/TestMongoConfiguration.java | 14 ++++++-- src/main/asciidoc/upgrading.adoc | 3 ++ 7 files changed, 62 insertions(+), 41 deletions(-) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/AbstractMongoClientConfiguration.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/AbstractMongoClientConfiguration.java index 5691df828..a9635c974 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/AbstractMongoClientConfiguration.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/AbstractMongoClientConfiguration.java @@ -19,13 +19,14 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.mongodb.MongoDatabaseFactory; import org.springframework.data.mongodb.SpringDataMongoDB; -import org.springframework.data.mongodb.core.MongoOperations; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.SimpleMongoClientDatabaseFactory; import org.springframework.data.mongodb.core.convert.DbRefResolver; import org.springframework.data.mongodb.core.convert.DefaultDbRefResolver; import org.springframework.data.mongodb.core.convert.MappingMongoConverter; +import org.springframework.data.mongodb.core.convert.MongoCustomConversions; import org.springframework.data.mongodb.core.mapping.Document; +import org.springframework.data.mongodb.core.mapping.MongoMappingContext; import org.springframework.lang.Nullable; import com.mongodb.MongoClientSettings; @@ -40,7 +41,7 @@ import com.mongodb.client.MongoClients; * @since 2.1 * @see MongoConfigurationSupport */ -@Configuration +@Configuration(proxyBeanMethods = false) public abstract class AbstractMongoClientConfiguration extends MongoConfigurationSupport { /** @@ -59,11 +60,12 @@ public abstract class AbstractMongoClientConfiguration extends MongoConfiguratio /** * Creates a {@link MongoTemplate}. * - * @return + * @see #mongoDbFactory() + * @see #mappingMongoConverter(MongoDatabaseFactory, MongoCustomConversions, MongoMappingContext) */ @Bean - public MongoTemplate mongoTemplate() throws Exception { - return new MongoTemplate(mongoDbFactory(), mappingMongoConverter()); + public MongoTemplate mongoTemplate(MongoDatabaseFactory databaseFactory, MappingMongoConverter converter) { + return new MongoTemplate(databaseFactory, converter); } /** @@ -71,8 +73,7 @@ public abstract class AbstractMongoClientConfiguration extends MongoConfiguratio * {@link MongoTemplate}. Will use the {@link MongoClient} instance configured in {@link #mongoClient()}. * * @see #mongoClient() - * @see #mongoTemplate() - * @return + * @see #mongoTemplate(MongoDatabaseFactory, MappingMongoConverter) */ @Bean public MongoDatabaseFactory mongoDbFactory() { @@ -99,21 +100,20 @@ public abstract class AbstractMongoClientConfiguration extends MongoConfiguratio /** * Creates a {@link MappingMongoConverter} using the configured {@link #mongoDbFactory()} and - * {@link #mongoMappingContext()}. Will get {@link #customConversions()} applied. + * {@link #mongoMappingContext(MongoCustomConversions)}. Will get {@link #customConversions()} applied. * * @see #customConversions() - * @see #mongoMappingContext() + * @see #mongoMappingContext(MongoCustomConversions) * @see #mongoDbFactory() - * @return - * @throws Exception */ @Bean - public MappingMongoConverter mappingMongoConverter() throws Exception { + public MappingMongoConverter mappingMongoConverter(MongoDatabaseFactory databaseFactory, + MongoCustomConversions customConversions, MongoMappingContext mappingContext) { - DbRefResolver dbRefResolver = new DefaultDbRefResolver(mongoDbFactory()); - MappingMongoConverter converter = new MappingMongoConverter(dbRefResolver, mongoMappingContext()); - converter.setCustomConversions(customConversions()); - converter.setCodecRegistryProvider(mongoDbFactory()); + DbRefResolver dbRefResolver = new DefaultDbRefResolver(databaseFactory); + MappingMongoConverter converter = new MappingMongoConverter(dbRefResolver, mappingContext); + converter.setCustomConversions(customConversions); + converter.setCodecRegistryProvider(databaseFactory); return converter; } diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/AbstractReactiveMongoConfiguration.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/AbstractReactiveMongoConfiguration.java index 8b538f9d0..f02fbaabf 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/AbstractReactiveMongoConfiguration.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/AbstractReactiveMongoConfiguration.java @@ -23,7 +23,9 @@ import org.springframework.data.mongodb.core.ReactiveMongoOperations; import org.springframework.data.mongodb.core.ReactiveMongoTemplate; import org.springframework.data.mongodb.core.SimpleReactiveMongoDatabaseFactory; import org.springframework.data.mongodb.core.convert.MappingMongoConverter; +import org.springframework.data.mongodb.core.convert.MongoCustomConversions; import org.springframework.data.mongodb.core.convert.NoOpDbRefResolver; +import org.springframework.data.mongodb.core.mapping.MongoMappingContext; import com.mongodb.MongoClientSettings; import com.mongodb.MongoClientSettings.Builder; @@ -38,7 +40,7 @@ import com.mongodb.reactivestreams.client.MongoClients; * @since 2.0 * @see MongoConfigurationSupport */ -@Configuration +@Configuration(proxyBeanMethods = false) public abstract class AbstractReactiveMongoConfiguration extends MongoConfigurationSupport { /** @@ -57,11 +59,14 @@ public abstract class AbstractReactiveMongoConfiguration extends MongoConfigurat /** * Creates {@link ReactiveMongoOperations}. * + * @see #reactiveMongoDbFactory() + * @see #mappingMongoConverter(ReactiveMongoDatabaseFactory, MongoCustomConversions, MongoMappingContext) * @return never {@literal null}. */ @Bean - public ReactiveMongoTemplate reactiveMongoTemplate() throws Exception { - return new ReactiveMongoTemplate(reactiveMongoDbFactory(), mappingMongoConverter()); + public ReactiveMongoTemplate reactiveMongoTemplate(ReactiveMongoDatabaseFactory databaseFactory, + MappingMongoConverter mongoConverter) { + return new ReactiveMongoTemplate(databaseFactory, mongoConverter); } /** @@ -69,7 +74,7 @@ public abstract class AbstractReactiveMongoConfiguration extends MongoConfigurat * {@link MongoClient} instance configured in {@link #reactiveMongoClient()}. * * @see #reactiveMongoClient() - * @see #reactiveMongoTemplate() + * @see #reactiveMongoTemplate(ReactiveMongoDatabaseFactory, MappingMongoConverter) * @return never {@literal null}. */ @Bean @@ -79,20 +84,20 @@ public abstract class AbstractReactiveMongoConfiguration extends MongoConfigurat /** * Creates a {@link MappingMongoConverter} using the configured {@link #reactiveMongoDbFactory()} and - * {@link #mongoMappingContext()}. Will get {@link #customConversions()} applied. + * {@link #mongoMappingContext(MongoCustomConversions)}. Will get {@link #customConversions()} applied. * * @see #customConversions() - * @see #mongoMappingContext() + * @see #mongoMappingContext(MongoCustomConversions) * @see #reactiveMongoDbFactory() * @return never {@literal null}. - * @throws Exception */ @Bean - public MappingMongoConverter mappingMongoConverter() throws Exception { + public MappingMongoConverter mappingMongoConverter(ReactiveMongoDatabaseFactory databaseFactory, + MongoCustomConversions customConversions, MongoMappingContext mappingContext) { - MappingMongoConverter converter = new MappingMongoConverter(NoOpDbRefResolver.INSTANCE, mongoMappingContext()); - converter.setCustomConversions(customConversions()); - converter.setCodecRegistryProvider(reactiveMongoDbFactory()); + MappingMongoConverter converter = new MappingMongoConverter(NoOpDbRefResolver.INSTANCE, mappingContext); + converter.setCustomConversions(customConversions); + converter.setCodecRegistryProvider(databaseFactory); return converter; } diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/MongoConfigurationSupport.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/MongoConfigurationSupport.java index 445c4ef79..efef317d8 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/MongoConfigurationSupport.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/MongoConfigurationSupport.java @@ -80,11 +80,12 @@ public abstract class MongoConfigurationSupport { * @throws ClassNotFoundException */ @Bean - public MongoMappingContext mongoMappingContext() throws ClassNotFoundException { + public MongoMappingContext mongoMappingContext(MongoCustomConversions customConversions) + throws ClassNotFoundException { MongoMappingContext mappingContext = new MongoMappingContext(); mappingContext.setInitialEntitySet(getInitialEntitySet()); - mappingContext.setSimpleTypeHolder(customConversions().getSimpleTypeHolder()); + mappingContext.setSimpleTypeHolder(customConversions.getSimpleTypeHolder()); mappingContext.setFieldNamingStrategy(fieldNamingStrategy()); mappingContext.setAutoIndexCreation(autoIndexCreation()); @@ -103,7 +104,7 @@ public abstract class MongoConfigurationSupport { * @return must not be {@literal null}. */ @Bean - public CustomConversions customConversions() { + public MongoCustomConversions customConversions() { return MongoCustomConversions.create(this::configureConverters); } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/AbstractMongoConfigurationUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/AbstractMongoConfigurationUnitTests.java index d51b6d234..b37f26144 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/AbstractMongoConfigurationUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/AbstractMongoConfigurationUnitTests.java @@ -34,6 +34,7 @@ import org.springframework.context.annotation.Configuration; import org.springframework.context.support.AbstractApplicationContext; import org.springframework.data.mongodb.MongoDatabaseFactory; import org.springframework.data.mongodb.core.convert.MappingMongoConverter; +import org.springframework.data.mongodb.core.convert.MongoCustomConversions; import org.springframework.data.mongodb.core.convert.MongoTypeMapper; import org.springframework.data.mongodb.core.mapping.BasicMongoPersistentEntity; import org.springframework.data.mongodb.core.mapping.Document; @@ -90,7 +91,7 @@ public class AbstractMongoConfigurationUnitTests { public void returnsUninitializedMappingContext() throws Exception { SampleMongoConfiguration configuration = new SampleMongoConfiguration(); - MongoMappingContext context = configuration.mongoMappingContext(); + MongoMappingContext context = configuration.mongoMappingContext(configuration.customConversions()); assertThat(context.getPersistentEntities()).isEmpty(); context.initialize(); @@ -159,11 +160,10 @@ public class AbstractMongoConfigurationUnitTests { return MongoClients.create(); } - @Bean @Override - public MappingMongoConverter mappingMongoConverter() throws Exception { - - MappingMongoConverter converter = super.mappingMongoConverter(); + public MappingMongoConverter mappingMongoConverter(MongoDatabaseFactory databaseFactory, + MongoCustomConversions customConversions, MongoMappingContext mappingContext) { + MappingMongoConverter converter = super.mappingMongoConverter(databaseFactory, customConversions, mappingContext); converter.setTypeMapper(typeMapper()); return converter; diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/AbstractReactiveMongoConfigurationUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/AbstractReactiveMongoConfigurationUnitTests.java index a89bdd299..5904651c7 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/AbstractReactiveMongoConfigurationUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/AbstractReactiveMongoConfigurationUnitTests.java @@ -32,8 +32,10 @@ import org.springframework.context.annotation.AnnotationConfigApplicationContext import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.support.AbstractApplicationContext; +import org.springframework.data.mongodb.ReactiveMongoDatabaseFactory; import org.springframework.data.mongodb.core.SimpleReactiveMongoDatabaseFactory; import org.springframework.data.mongodb.core.convert.MappingMongoConverter; +import org.springframework.data.mongodb.core.convert.MongoCustomConversions; import org.springframework.data.mongodb.core.convert.MongoTypeMapper; import org.springframework.data.mongodb.core.mapping.BasicMongoPersistentEntity; import org.springframework.data.mongodb.core.mapping.Document; @@ -89,7 +91,7 @@ public class AbstractReactiveMongoConfigurationUnitTests { public void returnsUninitializedMappingContext() throws Exception { SampleMongoConfiguration configuration = new SampleMongoConfiguration(); - MongoMappingContext context = configuration.mongoMappingContext(); + MongoMappingContext context = configuration.mongoMappingContext(configuration.customConversions()); assertThat(context.getPersistentEntities()).isEmpty(); context.initialize(); @@ -158,11 +160,11 @@ public class AbstractReactiveMongoConfigurationUnitTests { return MongoTestUtils.reactiveClient(); } - @Bean @Override - public MappingMongoConverter mappingMongoConverter() throws Exception { + public MappingMongoConverter mappingMongoConverter(ReactiveMongoDatabaseFactory databaseFactory, + MongoCustomConversions customConversions, MongoMappingContext mappingContext) { - MappingMongoConverter converter = super.mappingMongoConverter(); + MappingMongoConverter converter = super.mappingMongoConverter(databaseFactory, customConversions, mappingContext); converter.setTypeMapper(typeMapper()); return converter; diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/TestMongoConfiguration.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/TestMongoConfiguration.java index 9a9cd95e9..a5347dab4 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/TestMongoConfiguration.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/TestMongoConfiguration.java @@ -21,9 +21,11 @@ import java.util.List; import java.util.Set; import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Primary; import org.springframework.core.convert.converter.Converter; -import org.springframework.data.convert.CustomConversions; +import org.springframework.data.mongodb.MongoDatabaseFactory; import org.springframework.data.mongodb.config.AbstractMongoClientConfiguration; +import org.springframework.data.mongodb.core.convert.MappingMongoConverter; import org.springframework.data.mongodb.core.convert.MongoCustomConversions; import org.springframework.data.mongodb.core.mapping.MongoMappingContext; import org.springframework.data.mongodb.test.util.MongoTestUtils; @@ -37,6 +39,14 @@ public class TestMongoConfiguration extends AbstractMongoClientConfiguration { return "database"; } + @Primary + @Bean + @Override + public MappingMongoConverter mappingMongoConverter(MongoDatabaseFactory databaseFactory, + MongoCustomConversions customConversions, MongoMappingContext mappingContext) { + return super.mappingMongoConverter(databaseFactory, customConversions, mappingContext); + } + @Override @Bean public MongoClient mongoClient() { @@ -49,7 +59,7 @@ public class TestMongoConfiguration extends AbstractMongoClientConfiguration { } @Override - public CustomConversions customConversions() { + public MongoCustomConversions customConversions() { List> converters = new ArrayList<>(2); converters.add(new org.springframework.data.mongodb.core.PersonReadConverter()); diff --git a/src/main/asciidoc/upgrading.adoc b/src/main/asciidoc/upgrading.adoc index 5de900855..d2111515b 100644 --- a/src/main/asciidoc/upgrading.adoc +++ b/src/main/asciidoc/upgrading.adoc @@ -37,6 +37,9 @@ Uses `MongoClientSettings` instead of `MongoClientOptions`. | `ReactiveMongoClientSettingsFactoryBean` | Now produces `com.mongodb.MongoClientSettings` instead of `com.mongodb.async.client.MongoClientSettings` + +| `AbstractMongoClientConfiguration`, `AbstractReactiveMongoConfiguration` +| Configuration methods use parameter injection instead of calling local methods to avoid the need for cglib proxies |=== .Removed Java API: