Browse Source

Move reflection hint handling to repository context.

See: #3267
Original Pull Request: #3367
labs/stable-value
Christoph Strobl 3 months ago
parent
commit
19c26ba5df
No known key found for this signature in database
GPG Key ID: E6054036D0C37A4B
  1. 3
      src/main/java/org/springframework/data/aot/DefaultAotContext.java
  2. 4
      src/main/java/org/springframework/data/aot/ManagedTypesBeanRegistrationAotProcessor.java
  3. 15
      src/main/java/org/springframework/data/repository/config/RepositoryRegistrationAotProcessor.java

3
src/main/java/org/springframework/data/aot/DefaultAotContext.java

@ -33,6 +33,7 @@ import org.jspecify.annotations.Nullable; @@ -33,6 +33,7 @@ import org.jspecify.annotations.Nullable;
import org.springframework.aot.generate.GenerationContext;
import org.springframework.aot.hint.MemberCategory;
import org.springframework.aot.hint.TypeReference;
import org.springframework.aot.hint.annotation.ReflectiveRuntimeHintsRegistrar;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.beans.factory.aot.AotProcessingException;
@ -63,6 +64,7 @@ class DefaultAotContext implements AotContext { @@ -63,6 +64,7 @@ class DefaultAotContext implements AotContext {
private final Map<Class<?>, ContextualTypeConfiguration> typeConfigurations = new HashMap<>();
private final Environment environment;
private final ReflectiveRuntimeHintsRegistrar runtimeHintsRegistrar = new ReflectiveRuntimeHintsRegistrar();
public DefaultAotContext(BeanFactory beanFactory, Environment environment) {
this(beanFactory, environment, new AotMappingContext());
@ -257,6 +259,7 @@ class DefaultAotContext implements AotContext { @@ -257,6 +259,7 @@ class DefaultAotContext implements AotContext {
}
if (forDataBinding) {
runtimeHintsRegistrar.registerRuntimeHints(generationContext.getRuntimeHints(), type);
TypeContributor.contribute(type, Set.of(TypeContributor.DATA_NAMESPACE), generationContext);
}

4
src/main/java/org/springframework/data/aot/ManagedTypesBeanRegistrationAotProcessor.java

@ -155,7 +155,7 @@ public class ManagedTypesBeanRegistrationAotProcessor implements BeanRegistratio @@ -155,7 +155,7 @@ public class ManagedTypesBeanRegistrationAotProcessor implements BeanRegistratio
Set<String> annotationNamespaces = Collections.singleton(TypeContributor.DATA_NAMESPACE);
configureTypeHints(type.toClass(), aotContext);
configureTypeContribution(type.toClass(), aotContext);
TypeUtils.resolveUsedAnnotations(type.toClass()).forEach(
annotation -> TypeContributor.contribute(annotation.getType(), annotationNamespaces, generationContext));
@ -168,7 +168,7 @@ public class ManagedTypesBeanRegistrationAotProcessor implements BeanRegistratio @@ -168,7 +168,7 @@ public class ManagedTypesBeanRegistrationAotProcessor implements BeanRegistratio
* @param aotContext AOT context for type configuration.
* @since 4.0
*/
protected void configureTypeHints(Class<?> type, AotContext aotContext) {
protected void configureTypeContribution(Class<?> type, AotContext aotContext) {
aotContext.typeConfiguration(type, config -> config.forDataBinding().contributeAccessors().forQuerydsl());
}

15
src/main/java/org/springframework/data/repository/config/RepositoryRegistrationAotProcessor.java

@ -26,12 +26,9 @@ import java.util.stream.Stream; @@ -26,12 +26,9 @@ import java.util.stream.Stream;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jspecify.annotations.Nullable;
import org.springframework.aot.generate.GenerationContext;
import org.springframework.aot.hint.MemberCategory;
import org.springframework.aot.hint.RuntimeHints;
import org.springframework.aot.hint.TypeReference;
import org.springframework.aot.hint.annotation.ReflectiveRuntimeHintsRegistrar;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
@ -216,7 +213,8 @@ public class RepositoryRegistrationAotProcessor @@ -216,7 +213,8 @@ public class RepositoryRegistrationAotProcessor
* @param generationContext the generation context.
* @since 4.0
*/
private void configureTypeContributions(AotRepositoryContext repositoryContext, GenerationContext generationContext) {
protected void configureTypeContributions(AotRepositoryContext repositoryContext,
GenerationContext generationContext) {
RepositoryInformation information = repositoryContext.getRepositoryInformation();
@ -246,22 +244,17 @@ public class RepositoryRegistrationAotProcessor @@ -246,22 +244,17 @@ public class RepositoryRegistrationAotProcessor
* @param generationContext the generation context.
* @since 4.0
*/
protected void configureDomainTypeContributions(AotRepositoryContext repositoryContext,
private void configureDomainTypeContributions(AotRepositoryContext repositoryContext,
GenerationContext generationContext) {
RepositoryInformation information = repositoryContext.getRepositoryInformation();
RuntimeHints hints = generationContext.getRuntimeHints();
// Domain types, related types, projections
ReflectiveRuntimeHintsRegistrar registrar = new ReflectiveRuntimeHintsRegistrar();
Stream.concat(Stream.of(information.getDomainType()), information.getAlternativeDomainTypes().stream())
.forEach(it -> {
registrar.registerRuntimeHints(hints, it);
configureTypeContribution(it, repositoryContext);
});
// TODO: Looks like a duplicate
// Domain types my be part of this, but it also contains reachable ones.
repositoryContext.getResolvedTypes().stream()
.filter(it -> TypeContributor.isPartOf(it, Set.of(information.getDomainType().getPackageName())))
.forEach(it -> configureTypeContribution(it, repositoryContext));

Loading…
Cancel
Save