Skip to content

Commit 72ff0c7

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. Fixes GH-1921.
1 parent 73ee1c2 commit 72ff0c7

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

+29-25
Original file line numberDiff line numberDiff line change
@@ -159,18 +159,17 @@ public class RepositoryRestMvcConfiguration extends HateoasAwareSpringDataWebCon
159159
@Autowired ApplicationContext applicationContext;
160160

161161
@Autowired(required = false) List<BackendIdConverter> idConverters = Collections.emptyList();
162-
@Autowired(required = false) List<RepositoryRestConfigurer> configurers = Collections.emptyList();
163162
@Autowired(required = false) List<EntityLookup<?>> lookups = Collections.emptyList();
164163

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

167-
Optional<LinkRelationProvider> relProvider;
168-
Optional<CurieProvider> curieProvider;
169-
Optional<HalConfiguration> halConfiguration;
166+
ObjectProvider<LinkRelationProvider> relProvider;
167+
ObjectProvider<CurieProvider> curieProvider;
168+
ObjectProvider<HalConfiguration> halConfiguration;
170169
ObjectProvider<ObjectMapper> objectMapper;
171170
ObjectProvider<RepresentationModelProcessorInvoker> invoker;
172-
MessageResolver resolver;
173-
GeoModule geoModule;
171+
ObjectProvider<MessageResolver> resolver;
172+
ObjectProvider<GeoModule> geoModule;
174173
ConversionService defaultConversionService;
175174

176175
private final Lazy<ObjectMapper> mapper;
@@ -201,13 +200,13 @@ public class RepositoryRestMvcConfiguration extends HateoasAwareSpringDataWebCon
201200
public RepositoryRestMvcConfiguration( //
202201
ApplicationContext context, //
203202
@Qualifier("mvcConversionService") ObjectFactory<ConversionService> conversionService, //
204-
Optional<LinkRelationProvider> relProvider, //
205-
Optional<CurieProvider> curieProvider, //
206-
Optional<HalConfiguration> halConfiguration, //
203+
ObjectProvider<LinkRelationProvider> relProvider, //
204+
ObjectProvider<CurieProvider> curieProvider, //
205+
ObjectProvider<HalConfiguration> halConfiguration, //
207206
ObjectProvider<ObjectMapper> objectMapper, //
208207
ObjectProvider<RepresentationModelProcessorInvoker> invoker, //
209-
MessageResolver resolver, //
210-
GeoModule geoModule) {
208+
ObjectProvider<MessageResolver> resolver, //
209+
ObjectProvider<GeoModule> geoModule) {
211210

212211
super(context, conversionService);
213212

@@ -390,7 +389,7 @@ public BaseUri baseUri(RepositoryRestConfiguration repositoryRestConfiguration)
390389
* @return
391390
*/
392391
@Bean
393-
public AnnotatedEventHandlerInvoker annotatedEventHandlerInvoker() {
392+
public static AnnotatedEventHandlerInvoker annotatedEventHandlerInvoker() {
394393
return new AnnotatedEventHandlerInvoker();
395394
}
396395

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

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

468471
return new RepositoryEntityLinks(repositories, resourceMappings, repositoryRestConfiguration, templateVariables,
469472
backendIdConverterRegistry);
@@ -498,7 +501,8 @@ public PersistentEntityToJsonSchemaConverter jsonSchemaConverter(PersistentEntit
498501
Associations associationLinks, @Qualifier RepositoryInvokerFactory repositoryInvokerFactory,
499502
RepositoryRestConfiguration repositoryRestConfiguration) {
500503

501-
return new PersistentEntityToJsonSchemaConverter(persistentEntities, associationLinks, resolver, objectMapper(),
504+
return new PersistentEntityToJsonSchemaConverter(persistentEntities, associationLinks, resolver.getObject(),
505+
objectMapper(),
502506
repositoryRestConfiguration, new ValueTypeSchemaPropertyCustomizerFactory(repositoryInvokerFactory));
503507
}
504508

@@ -570,11 +574,11 @@ public TypeConstrainedMappingJackson2HttpMessageConverter halJacksonHttpMessageC
570574

571575
public ObjectMapper halObjectMapper(LinkCollector linkCollector) {
572576

573-
LinkRelationProvider defaultedRelProvider = this.relProvider.orElseGet(EvoInflectorLinkRelationProvider::new);
574-
HalConfiguration halConfiguration = this.halConfiguration.orElseGet(HalConfiguration::new);
575-
577+
LinkRelationProvider defaultedRelProvider = this.relProvider.getIfUnique(EvoInflectorLinkRelationProvider::new);
578+
HalConfiguration halConfiguration = this.halConfiguration.getIfUnique(HalConfiguration::new);
576579
HalHandlerInstantiator instantiator = new HalHandlerInstantiator(defaultedRelProvider,
577-
curieProvider.orElse(new DefaultCurieProvider(Collections.emptyMap())), resolver, halConfiguration);
580+
curieProvider.getIfUnique(() -> new DefaultCurieProvider(Collections.emptyMap())), resolver.getObject(),
581+
halConfiguration);
578582

579583
ObjectMapper mapper = basicObjectMapper();
580584
mapper.registerModule(persistentEntityJackson2Module(linkCollector));
@@ -886,7 +890,7 @@ protected ObjectMapper basicObjectMapper() {
886890
// Configure custom Modules
887891
configurerDelegate.get().configureJacksonObjectMapper(objectMapper);
888892

889-
objectMapper.registerModule(geoModule);
893+
objectMapper.registerModule(geoModule.getObject());
890894

891895
if (repositoryRestConfiguration.get().isEnableEnumTranslation()) {
892896
objectMapper.registerModule(new JacksonSerializers(enumTranslator.get()));
@@ -927,7 +931,7 @@ public RootResourceInformationToAlpsDescriptorConverter alpsConverter(Repositori
927931
Associations associationLinks, RepositoryRestConfiguration repositoryRestConfiguration) {
928932

929933
return new RootResourceInformationToAlpsDescriptorConverter(associationLinks, repositories, persistentEntities,
930-
entityLinks, resolver, repositoryRestConfiguration, objectMapper(), enumTranslator);
934+
entityLinks, resolver.getObject(), repositoryRestConfiguration, objectMapper(), enumTranslator);
931935
}
932936

933937
@Bean

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

+13-5
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)