Skip to content

Commit 1e78de5

Browse files
committed
DATAREST-1590 - Avoid need for eager access to components in RepositoryRestMvcConfiguration.
Switch to ObjectProvider for all component dependencies in the constructor of RepositoryRestMvcConfiguration. Made the bean definition of AnnotatedEventHandlerInvoker a static bean as it's an application listener and it being an instance method causes extend initialization of the configuration class trickling down into unnecessary bean lookups that early in the lifecycle.
1 parent def0f5b commit 1e78de5

File tree

2 files changed

+42
-30
lines changed

2 files changed

+42
-30
lines changed

spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/config/RepositoryRestMvcConfiguration.java

Lines changed: 29 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -158,18 +158,17 @@ public class RepositoryRestMvcConfiguration extends HateoasAwareSpringDataWebCon
158158
@Autowired ApplicationContext applicationContext;
159159

160160
@Autowired(required = false) List<BackendIdConverter> idConverters = Collections.emptyList();
161-
@Autowired(required = false) List<RepositoryRestConfigurer> configurers = Collections.emptyList();
162161
@Autowired(required = false) List<EntityLookup<?>> lookups = Collections.emptyList();
163162

164163
@Autowired List<HttpMessageConverter<?>> defaultMessageConverters;
165164

166-
Optional<LinkRelationProvider> relProvider;
167-
Optional<CurieProvider> curieProvider;
168-
Optional<HalConfiguration> halConfiguration;
165+
ObjectProvider<LinkRelationProvider> relProvider;
166+
ObjectProvider<CurieProvider> curieProvider;
167+
ObjectProvider<HalConfiguration> halConfiguration;
169168
ObjectProvider<ObjectMapper> objectMapper;
170169
ObjectProvider<RepresentationModelProcessorInvoker> invoker;
171-
MessageResolver resolver;
172-
GeoModule geoModule;
170+
ObjectProvider<MessageResolver> resolver;
171+
ObjectProvider<GeoModule> geoModule;
173172
ConversionService defaultConversionService;
174173

175174
private final Lazy<ObjectMapper> mapper;
@@ -200,13 +199,13 @@ public class RepositoryRestMvcConfiguration extends HateoasAwareSpringDataWebCon
200199
public RepositoryRestMvcConfiguration( //
201200
ApplicationContext context, //
202201
@Qualifier("mvcConversionService") ObjectFactory<ConversionService> conversionService, //
203-
Optional<LinkRelationProvider> relProvider, //
204-
Optional<CurieProvider> curieProvider, //
205-
Optional<HalConfiguration> halConfiguration, //
202+
ObjectProvider<LinkRelationProvider> relProvider, //
203+
ObjectProvider<CurieProvider> curieProvider, //
204+
ObjectProvider<HalConfiguration> halConfiguration, //
206205
ObjectProvider<ObjectMapper> objectMapper, //
207206
ObjectProvider<RepresentationModelProcessorInvoker> invoker, //
208-
MessageResolver resolver, //
209-
GeoModule geoModule) {
207+
ObjectProvider<MessageResolver> resolver, //
208+
ObjectProvider<GeoModule> geoModule) {
210209

211210
super(context, conversionService);
212211

@@ -389,7 +388,7 @@ public BaseUri baseUri(RepositoryRestConfiguration repositoryRestConfiguration)
389388
* @return
390389
*/
391390
@Bean
392-
public AnnotatedEventHandlerInvoker annotatedEventHandlerInvoker() {
391+
public static AnnotatedEventHandlerInvoker annotatedEventHandlerInvoker() {
393392
return new AnnotatedEventHandlerInvoker();
394393
}
395394

@@ -456,13 +455,17 @@ public ETagArgumentResolver eTagArgumentResolver() {
456455
* @throws Exception
457456
*/
458457
@Bean
459-
public RepositoryEntityLinks entityLinks(HateoasPageableHandlerMethodArgumentResolver pageableResolver,
460-
Repositories repositories, RepositoryResourceMappings resourceMappings,
461-
PluginRegistry<BackendIdConverter, Class<?>> backendIdConverterRegistry,
462-
RepositoryRestConfiguration repositoryRestConfiguration, HateoasSortHandlerMethodArgumentResolver sortResolver) {
458+
public RepositoryEntityLinks entityLinks(ObjectFactory<HateoasPageableHandlerMethodArgumentResolver> pageableResolver, //
459+
Repositories repositories, //
460+
RepositoryResourceMappings resourceMappings, //
461+
PluginRegistry<BackendIdConverter, //
462+
Class<?>> backendIdConverterRegistry, //
463+
RepositoryRestConfiguration repositoryRestConfiguration, //
464+
ObjectFactory<HateoasSortHandlerMethodArgumentResolver> sortResolver) {
463465

464-
PagingAndSortingTemplateVariables templateVariables = new ArgumentResolverPagingAndSortingTemplateVariables(
465-
pageableResolver, sortResolver);
466+
Lazy<PagingAndSortingTemplateVariables> templateVariables = Lazy
467+
.of(() -> new ArgumentResolverPagingAndSortingTemplateVariables(pageableResolver.getObject(),
468+
sortResolver.getObject()));
466469

467470
return new RepositoryEntityLinks(repositories, resourceMappings, repositoryRestConfiguration, templateVariables,
468471
backendIdConverterRegistry);
@@ -497,7 +500,8 @@ public PersistentEntityToJsonSchemaConverter jsonSchemaConverter(PersistentEntit
497500
Associations associationLinks, @Qualifier RepositoryInvokerFactory repositoryInvokerFactory,
498501
RepositoryRestConfiguration repositoryRestConfiguration) {
499502

500-
return new PersistentEntityToJsonSchemaConverter(persistentEntities, associationLinks, resolver, objectMapper(),
503+
return new PersistentEntityToJsonSchemaConverter(persistentEntities, associationLinks, resolver.getObject(),
504+
objectMapper(),
501505
repositoryRestConfiguration, new ValueTypeSchemaPropertyCustomizerFactory(repositoryInvokerFactory));
502506
}
503507

@@ -569,11 +573,11 @@ public TypeConstrainedMappingJackson2HttpMessageConverter halJacksonHttpMessageC
569573

570574
public ObjectMapper halObjectMapper(LinkCollector linkCollector) {
571575

572-
LinkRelationProvider defaultedRelProvider = this.relProvider.orElseGet(EvoInflectorLinkRelationProvider::new);
573-
HalConfiguration halConfiguration = this.halConfiguration.orElseGet(HalConfiguration::new);
574-
576+
LinkRelationProvider defaultedRelProvider = this.relProvider.getIfUnique(EvoInflectorLinkRelationProvider::new);
577+
HalConfiguration halConfiguration = this.halConfiguration.getIfUnique(HalConfiguration::new);
575578
HalHandlerInstantiator instantiator = new HalHandlerInstantiator(defaultedRelProvider,
576-
curieProvider.orElse(new DefaultCurieProvider(Collections.emptyMap())), resolver, halConfiguration);
579+
curieProvider.getIfUnique(() -> new DefaultCurieProvider(Collections.emptyMap())), resolver.getObject(),
580+
halConfiguration);
577581

578582
ObjectMapper mapper = basicObjectMapper();
579583
mapper.registerModule(persistentEntityJackson2Module(linkCollector));
@@ -885,7 +889,7 @@ protected ObjectMapper basicObjectMapper() {
885889
// Configure custom Modules
886890
configurerDelegate.get().configureJacksonObjectMapper(objectMapper);
887891

888-
objectMapper.registerModule(geoModule);
892+
objectMapper.registerModule(geoModule.getObject());
889893

890894
if (repositoryRestConfiguration.get().isEnableEnumTranslation()) {
891895
objectMapper.registerModule(new JacksonSerializers(enumTranslator.get()));
@@ -926,7 +930,7 @@ public RootResourceInformationToAlpsDescriptorConverter alpsConverter(Repositori
926930
Associations associationLinks, RepositoryRestConfiguration repositoryRestConfiguration) {
927931

928932
return new RootResourceInformationToAlpsDescriptorConverter(associationLinks, repositories, persistentEntities,
929-
entityLinks, resolver, repositoryRestConfiguration, objectMapper(), enumTranslator);
933+
entityLinks, resolver.getObject(), repositoryRestConfiguration, objectMapper(), enumTranslator);
930934
}
931935

932936
@Bean

spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/support/RepositoryEntityLinks.java

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import org.springframework.data.rest.webmvc.BaseUri;
3636
import org.springframework.data.rest.webmvc.spi.BackendIdConverter;
3737
import org.springframework.data.rest.webmvc.spi.BackendIdConverter.DefaultIdConverter;
38+
import org.springframework.data.util.Lazy;
3839
import org.springframework.hateoas.Link;
3940
import org.springframework.hateoas.LinkRelation;
4041
import org.springframework.hateoas.Links;
@@ -62,11 +63,18 @@ public class RepositoryEntityLinks extends AbstractEntityLinks {
6263
private final Repositories repositories;
6364
private final ResourceMappings mappings;
6465
private final RepositoryRestConfiguration config;
65-
private final PagingAndSortingTemplateVariables templateVariables;
66+
private final Lazy<PagingAndSortingTemplateVariables> templateVariables;
6667
private final PluginRegistry<BackendIdConverter, Class<?>> idConverters;
6768

6869
public RepositoryEntityLinks(Repositories repositories, ResourceMappings mappings, RepositoryRestConfiguration config,
6970
PagingAndSortingTemplateVariables templateVariables, PluginRegistry<BackendIdConverter, Class<?>> idConverters) {
71+
this(repositories, mappings, config, Lazy.of(templateVariables), idConverters);
72+
}
73+
74+
public RepositoryEntityLinks(Repositories repositories, ResourceMappings mappings,
75+
RepositoryRestConfiguration config,
76+
Lazy<PagingAndSortingTemplateVariables> templateVariables,
77+
PluginRegistry<BackendIdConverter, Class<?>> idConverters) {
7078

7179
Assert.notNull(repositories, "Repositories must not be null!");
7280
Assert.notNull(mappings, "ResourceMappings must not be null!");
@@ -297,7 +305,7 @@ private Link getSearchResourceLinkFor(Class<?> type, LinkRelation rel, Pageable
297305
private TemplateVariables getTemplateVariables(UriComponents components, ResourceMapping mapping, Pageable pageable) {
298306

299307
if (mapping.isPagingResource()) {
300-
return templateVariables.getPaginationTemplateVariables(null, components);
308+
return templateVariables.get().getPaginationTemplateVariables(null, components);
301309
} else {
302310
return TemplateVariables.NONE;
303311
}
@@ -317,7 +325,7 @@ private TemplateVariables getTemplateVariables(UriComponents components, MethodR
317325
Pageable pageable, Sort sort) {
318326

319327
if (mapping.isSortableResource()) {
320-
return templateVariables.getSortTemplateVariables(null, components);
328+
return templateVariables.get().getSortTemplateVariables(null, components);
321329
} else {
322330
return getTemplateVariables(components, mapping, pageable);
323331
}
@@ -362,7 +370,7 @@ private UriComponents prepareUri(String uri, MethodResourceMapping mapping, Page
362370

363371
if (mapping.isSortableResource()) {
364372
UriComponentsBuilder uriBuilder = UriComponentsBuilder.fromUriString(uri);
365-
templateVariables.enhance(uriBuilder, null, sort);
373+
templateVariables.get().enhance(uriBuilder, null, sort);
366374
return uriBuilder.build();
367375
} else {
368376
return prepareUri(uri, mapping, pageable);
@@ -374,7 +382,7 @@ private UriComponents prepareUri(String uri, ResourceMapping mapping, Pageable p
374382
UriComponentsBuilder uriBuilder = UriComponentsBuilder.fromUriString(uri);
375383

376384
if (mapping.isPagingResource()) {
377-
templateVariables.enhance(uriBuilder, null, pageable);
385+
templateVariables.get().enhance(uriBuilder, null, pageable);
378386
}
379387

380388
return uriBuilder.build();

0 commit comments

Comments
 (0)