From 3db5fc728e6f28c2ea905c2a9ab5c47220098921 Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Thu, 20 Oct 2022 09:09:54 +0200 Subject: [PATCH] Polishing. See: #4211 Original pull request: #4212 --- .../aot/LazyLoadingProxyAotProcessor.java | 4 +- .../data/mongodb/aot/MongoAotPredicates.java | 11 +++- .../data/mongodb/aot/MongoRuntimeHints.java | 26 +++----- .../aot/AotMongoRepositoryPostProcessor.java | 4 +- .../aot/RepositoryRuntimeHints.java | 61 +++++++++++++++++++ ...MongoRepositoryConfigurationExtension.java | 2 +- .../resources/META-INF/spring/aot.factories | 3 +- 7 files changed, 85 insertions(+), 26 deletions(-) rename spring-data-mongodb/src/main/java/org/springframework/data/mongodb/{ => repository}/aot/AotMongoRepositoryPostProcessor.java (89%) create mode 100644 spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/aot/RepositoryRuntimeHints.java diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/aot/LazyLoadingProxyAotProcessor.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/aot/LazyLoadingProxyAotProcessor.java index 83abac1df..108a5f90b 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/aot/LazyLoadingProxyAotProcessor.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/aot/LazyLoadingProxyAotProcessor.java @@ -39,11 +39,11 @@ import org.springframework.data.mongodb.core.mapping.DocumentReference; * @author Christoph Strobl * @since 4.0 */ -class LazyLoadingProxyAotProcessor { +public class LazyLoadingProxyAotProcessor { private boolean generalLazyLoadingProxyContributed = false; - void registerLazyLoadingProxyIfNeeded(Class type, GenerationContext generationContext) { + public void registerLazyLoadingProxyIfNeeded(Class type, GenerationContext generationContext) { Set refFields = getFieldsWithAnnotationPresent(type, Reference.class); if (refFields.isEmpty()) { diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/aot/MongoAotPredicates.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/aot/MongoAotPredicates.java index 0e37c23e0..7f06bb68c 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/aot/MongoAotPredicates.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/aot/MongoAotPredicates.java @@ -19,13 +19,20 @@ import java.util.function.Predicate; import org.springframework.data.aot.TypeUtils; import org.springframework.data.mongodb.core.mapping.MongoSimpleTypes; +import org.springframework.data.repository.util.ReactiveWrappers; +import org.springframework.data.repository.util.ReactiveWrappers.ReactiveLibrary; /** * @author Christoph Strobl * @since 4.0 */ -class MongoAotPredicates { +public class MongoAotPredicates { - static final Predicate> IS_SIMPLE_TYPE = (type) -> MongoSimpleTypes.HOLDER.isSimpleType(type) || TypeUtils.type(type).isPartOf("org.bson"); + public static final Predicate> IS_SIMPLE_TYPE = (type) -> MongoSimpleTypes.HOLDER.isSimpleType(type) || TypeUtils.type(type).isPartOf("org.bson"); + public static final Predicate IS_REACTIVE_LIBARARY_AVAILABLE = (lib) -> ReactiveWrappers.isAvailable(lib); + + public static boolean isReactorPresent() { + return IS_REACTIVE_LIBARARY_AVAILABLE.test(ReactiveWrappers.ReactiveLibrary.PROJECT_REACTOR); + } } diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/aot/MongoRuntimeHints.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/aot/MongoRuntimeHints.java index 74e7b3b9e..c97a0f07f 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/aot/MongoRuntimeHints.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/aot/MongoRuntimeHints.java @@ -15,6 +15,8 @@ */ package org.springframework.data.mongodb.aot; +import static org.springframework.data.mongodb.aot.MongoAotPredicates.*; + import java.util.Arrays; import org.springframework.aot.hint.MemberCategory; @@ -29,9 +31,6 @@ import org.springframework.data.mongodb.core.mapping.event.ReactiveAfterConvertC import org.springframework.data.mongodb.core.mapping.event.ReactiveAfterSaveCallback; import org.springframework.data.mongodb.core.mapping.event.ReactiveBeforeConvertCallback; import org.springframework.data.mongodb.core.mapping.event.ReactiveBeforeSaveCallback; -import org.springframework.data.querydsl.QuerydslPredicateExecutor; -import org.springframework.data.querydsl.QuerydslUtils; -import org.springframework.data.repository.util.ReactiveWrappers; import org.springframework.lang.Nullable; /** @@ -43,35 +42,24 @@ import org.springframework.lang.Nullable; */ class MongoRuntimeHints implements RuntimeHintsRegistrar { - private static final boolean PROJECT_REACTOR_PRESENT = ReactiveWrappers - .isAvailable(ReactiveWrappers.ReactiveLibrary.PROJECT_REACTOR); - @Override public void registerHints(RuntimeHints hints, @Nullable ClassLoader classLoader) { hints.reflection().registerTypes( - Arrays.asList(TypeReference.of("org.springframework.data.mongodb.repository.support.SimpleMongoRepository"), - TypeReference.of(BeforeConvertCallback.class), TypeReference.of(BeforeSaveCallback.class), + Arrays.asList(TypeReference.of(BeforeConvertCallback.class), TypeReference.of(BeforeSaveCallback.class), TypeReference.of(AfterConvertCallback.class), TypeReference.of(AfterSaveCallback.class)), builder -> builder.withMembers(MemberCategory.INVOKE_DECLARED_CONSTRUCTORS, MemberCategory.INVOKE_PUBLIC_METHODS)); - if (PROJECT_REACTOR_PRESENT) { + if (isReactorPresent()) { hints.reflection() - .registerTypes(Arrays.asList( - TypeReference.of("org.springframework.data.mongodb.repository.support.SimpleReactiveMongoRepository"), - TypeReference.of(ReactiveBeforeConvertCallback.class), TypeReference.of(ReactiveBeforeSaveCallback.class), - TypeReference.of(ReactiveAfterConvertCallback.class), TypeReference.of(ReactiveAfterSaveCallback.class)), + .registerTypes(Arrays.asList(TypeReference.of(ReactiveBeforeConvertCallback.class), + TypeReference.of(ReactiveBeforeSaveCallback.class), TypeReference.of(ReactiveAfterConvertCallback.class), + TypeReference.of(ReactiveAfterSaveCallback.class)), builder -> builder.withMembers(MemberCategory.INVOKE_DECLARED_CONSTRUCTORS, MemberCategory.INVOKE_PUBLIC_METHODS)); - if(QuerydslUtils.QUERY_DSL_PRESENT) { - - hints.reflection().registerType(TypeReference.of("org.springframework.data.mongodb.repository.support.QuerydslMongoPredicateExecutor"), - hint -> hint.withMembers(MemberCategory.INVOKE_PUBLIC_CONSTRUCTORS, MemberCategory.INVOKE_PUBLIC_METHODS) - .onReachableType(QuerydslPredicateExecutor.class)); - } } } } diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/aot/AotMongoRepositoryPostProcessor.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/aot/AotMongoRepositoryPostProcessor.java similarity index 89% rename from spring-data-mongodb/src/main/java/org/springframework/data/mongodb/aot/AotMongoRepositoryPostProcessor.java rename to spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/aot/AotMongoRepositoryPostProcessor.java index c530d4e32..c978c22b4 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/aot/AotMongoRepositoryPostProcessor.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/aot/AotMongoRepositoryPostProcessor.java @@ -13,10 +13,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.data.mongodb.aot; +package org.springframework.data.mongodb.repository.aot; import org.springframework.aot.generate.GenerationContext; import org.springframework.data.aot.TypeContributor; +import org.springframework.data.mongodb.aot.LazyLoadingProxyAotProcessor; +import org.springframework.data.mongodb.aot.MongoAotPredicates; import org.springframework.data.repository.aot.AotRepositoryContext; import org.springframework.data.repository.aot.RepositoryRegistrationAotProcessor; diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/aot/RepositoryRuntimeHints.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/aot/RepositoryRuntimeHints.java new file mode 100644 index 000000000..547150027 --- /dev/null +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/aot/RepositoryRuntimeHints.java @@ -0,0 +1,61 @@ +/* + * Copyright 2022 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 + * + * https://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.data.mongodb.repository.aot; + +import static org.springframework.data.mongodb.aot.MongoAotPredicates.*; + +import java.util.Arrays; + +import org.springframework.aot.hint.MemberCategory; +import org.springframework.aot.hint.RuntimeHints; +import org.springframework.aot.hint.RuntimeHintsRegistrar; +import org.springframework.aot.hint.TypeReference; +import org.springframework.data.querydsl.QuerydslPredicateExecutor; +import org.springframework.data.querydsl.QuerydslUtils; +import org.springframework.lang.Nullable; + +/** + * @author Christoph Strobl + * @since 4.0 + */ +class RepositoryRuntimeHints implements RuntimeHintsRegistrar { + + @Override + public void registerHints(RuntimeHints hints, @Nullable ClassLoader classLoader) { + + hints.reflection().registerTypes( + Arrays.asList(TypeReference.of("org.springframework.data.mongodb.repository.support.SimpleMongoRepository")), + builder -> builder.withMembers(MemberCategory.INVOKE_DECLARED_CONSTRUCTORS, + MemberCategory.INVOKE_PUBLIC_METHODS)); + + if (isReactorPresent()) { + + hints.reflection().registerTypes( + Arrays.asList( + TypeReference.of("org.springframework.data.mongodb.repository.support.SimpleReactiveMongoRepository")), + builder -> builder.withMembers(MemberCategory.INVOKE_DECLARED_CONSTRUCTORS, + MemberCategory.INVOKE_PUBLIC_METHODS)); + } + + if (QuerydslUtils.QUERY_DSL_PRESENT) { + + hints.reflection().registerType( + TypeReference.of("org.springframework.data.mongodb.repository.support.QuerydslMongoPredicateExecutor"), + hint -> hint.withMembers(MemberCategory.INVOKE_PUBLIC_CONSTRUCTORS, MemberCategory.INVOKE_PUBLIC_METHODS) + .onReachableType(QuerydslPredicateExecutor.class)); + } + } +} diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/config/MongoRepositoryConfigurationExtension.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/config/MongoRepositoryConfigurationExtension.java index 396ee4f97..7f846730a 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/config/MongoRepositoryConfigurationExtension.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/config/MongoRepositoryConfigurationExtension.java @@ -23,7 +23,7 @@ import org.springframework.beans.factory.aot.BeanRegistrationAotProcessor; import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.core.annotation.AnnotationAttributes; import org.springframework.data.config.ParsingUtils; -import org.springframework.data.mongodb.aot.AotMongoRepositoryPostProcessor; +import org.springframework.data.mongodb.repository.aot.AotMongoRepositoryPostProcessor; import org.springframework.data.mongodb.core.mapping.Document; import org.springframework.data.mongodb.repository.MongoRepository; import org.springframework.data.mongodb.repository.support.MongoRepositoryFactoryBean; diff --git a/spring-data-mongodb/src/main/resources/META-INF/spring/aot.factories b/spring-data-mongodb/src/main/resources/META-INF/spring/aot.factories index 186b66841..0130a33d7 100644 --- a/spring-data-mongodb/src/main/resources/META-INF/spring/aot.factories +++ b/spring-data-mongodb/src/main/resources/META-INF/spring/aot.factories @@ -1,5 +1,6 @@ org.springframework.aot.hint.RuntimeHintsRegistrar=\ - org.springframework.data.mongodb.aot.MongoRuntimeHints + org.springframework.data.mongodb.aot.MongoRuntimeHints,\ + org.springframework.data.mongodb.repository.aot.RepositoryRuntimeHints org.springframework.beans.factory.aot.BeanRegistrationAotProcessor=\ org.springframework.data.mongodb.aot.MongoManagedTypesBeanRegistrationAotProcessor