From 1f8c0a423010929e9bfe48ce44c2df08300fa62f Mon Sep 17 00:00:00 2001 From: Oliver Drotbohm Date: Fri, 3 Apr 2020 18:24:52 +0200 Subject: [PATCH] #1252 - Polishing. We now make sure that BeanPostProcessors that are exposed consume their dependencies via ObjectFactory instances to avoid the need to prematurely trigger bean instantiation in the BeanPostProcessor detection phase. Marked the direct dependencies of the post processors as lazy, as the post processor only do actual work if beans of a particular type are available in the ApplicationContext. In case they aren't we don't even need to instantiate the downstream dependencies of the processors. Avoid proxying of configuration classes where possible. Related pull request: #1251. --- .../config/EntityLinksConfiguration.java | 2 +- .../hateoas/config/HateoasConfiguration.java | 2 +- .../RestTemplateHateoasConfiguration.java | 17 ++++++++-------- .../config/WebClientHateoasConfiguration.java | 20 ++++++++++--------- .../config/WebFluxHateoasConfiguration.java | 2 +- .../WebMvcEntityLinksConfiguration.java | 2 +- .../config/WebMvcHateoasConfiguration.java | 2 +- .../hal/HalMediaTypeConfiguration.java | 2 +- 8 files changed, 26 insertions(+), 23 deletions(-) diff --git a/src/main/java/org/springframework/hateoas/config/EntityLinksConfiguration.java b/src/main/java/org/springframework/hateoas/config/EntityLinksConfiguration.java index 7dbb5665..78dc3489 100644 --- a/src/main/java/org/springframework/hateoas/config/EntityLinksConfiguration.java +++ b/src/main/java/org/springframework/hateoas/config/EntityLinksConfiguration.java @@ -29,7 +29,7 @@ import org.springframework.plugin.core.support.PluginRegistryFactoryBean; * @author Greg Turnquist * @author Oliver Gierke */ -@Configuration +@Configuration(proxyBeanMethods = false) class EntityLinksConfiguration { @Bean diff --git a/src/main/java/org/springframework/hateoas/config/HateoasConfiguration.java b/src/main/java/org/springframework/hateoas/config/HateoasConfiguration.java index 7c2a4f5d..f2555f61 100644 --- a/src/main/java/org/springframework/hateoas/config/HateoasConfiguration.java +++ b/src/main/java/org/springframework/hateoas/config/HateoasConfiguration.java @@ -59,7 +59,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; * @soundtrack Elephants Crossing - Wait (Live at Stadtfest Dresden) * @since 0.19 */ -@Configuration +@Configuration(proxyBeanMethods = false) @EnablePluginRegistries({ LinkDiscoverer.class }) public class HateoasConfiguration { diff --git a/src/main/java/org/springframework/hateoas/config/RestTemplateHateoasConfiguration.java b/src/main/java/org/springframework/hateoas/config/RestTemplateHateoasConfiguration.java index c99f35c2..d2c0585c 100644 --- a/src/main/java/org/springframework/hateoas/config/RestTemplateHateoasConfiguration.java +++ b/src/main/java/org/springframework/hateoas/config/RestTemplateHateoasConfiguration.java @@ -18,9 +18,11 @@ package org.springframework.hateoas.config; import lombok.RequiredArgsConstructor; import org.springframework.beans.BeansException; +import org.springframework.beans.factory.ObjectFactory; import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Lazy; import org.springframework.lang.NonNull; import org.springframework.web.client.RestTemplate; @@ -30,16 +32,17 @@ import org.springframework.web.client.RestTemplate; * @author Greg Turnquist * @author Oliver Drotbohm */ -@Configuration +@Configuration(proxyBeanMethods = false) class RestTemplateHateoasConfiguration { @Bean static HypermediaRestTemplateBeanPostProcessor hypermediaRestTemplateBeanPostProcessor( - HypermediaRestTemplateConfigurer configurer) { + ObjectFactory configurer) { return new HypermediaRestTemplateBeanPostProcessor(configurer); } @Bean + @Lazy HypermediaRestTemplateConfigurer hypermediaRestTemplateConfigurer(WebConverters converters) { return new HypermediaRestTemplateConfigurer(converters); } @@ -54,7 +57,7 @@ class RestTemplateHateoasConfiguration { @RequiredArgsConstructor static class HypermediaRestTemplateBeanPostProcessor implements BeanPostProcessor { - private final HypermediaRestTemplateConfigurer configurer; + private final ObjectFactory configurer; /* * (non-Javadoc) @@ -64,11 +67,9 @@ class RestTemplateHateoasConfiguration { @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { - if (!RestTemplate.class.isInstance(bean)) { - return bean; - } - - return this.configurer.registerHypermediaTypes((RestTemplate) bean); + return !RestTemplate.class.isInstance(bean) // + ? bean + : this.configurer.getObject().registerHypermediaTypes((RestTemplate) bean); } } } diff --git a/src/main/java/org/springframework/hateoas/config/WebClientHateoasConfiguration.java b/src/main/java/org/springframework/hateoas/config/WebClientHateoasConfiguration.java index b5017073..1c30fc41 100644 --- a/src/main/java/org/springframework/hateoas/config/WebClientHateoasConfiguration.java +++ b/src/main/java/org/springframework/hateoas/config/WebClientHateoasConfiguration.java @@ -20,10 +20,12 @@ import lombok.RequiredArgsConstructor; import java.util.List; import org.springframework.beans.BeansException; +import org.springframework.beans.factory.ObjectFactory; import org.springframework.beans.factory.ObjectProvider; import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Lazy; import org.springframework.lang.NonNull; import org.springframework.web.reactive.function.client.WebClient; @@ -33,19 +35,21 @@ import com.fasterxml.jackson.databind.ObjectMapper; * Spring WebFlux HATEOAS configuration. * * @author Greg Turnquist - * @since 1.0 TODO: Inspect ApplicationContext -> WebApplicationContext -> WebMVC + * @since 1.0 */ -@Configuration +@Configuration(proxyBeanMethods = false) class WebClientHateoasConfiguration { @Bean + @Lazy HypermediaWebClientConfigurer webClientConfigurer(ObjectProvider mapper, List hypermediaTypes) { return new HypermediaWebClientConfigurer(mapper.getIfAvailable(ObjectMapper::new), hypermediaTypes); } @Bean - static HypermediaWebClientBeanPostProcessor webClientBeanPostProcessor(HypermediaWebClientConfigurer configurer) { + static HypermediaWebClientBeanPostProcessor webClientBeanPostProcessor( + ObjectFactory configurer) { return new HypermediaWebClientBeanPostProcessor(configurer); } @@ -59,7 +63,7 @@ class WebClientHateoasConfiguration { @RequiredArgsConstructor static class HypermediaWebClientBeanPostProcessor implements BeanPostProcessor { - private final HypermediaWebClientConfigurer configurer; + private final ObjectFactory configurer; /* * (non-Javadoc) @@ -69,11 +73,9 @@ class WebClientHateoasConfiguration { @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { - if (WebClient.class.isInstance(bean)) { - return this.configurer.registerHypermediaTypes(((WebClient) bean).mutate()).build(); - } - - return bean; + return !WebClient.class.isInstance(bean) // + ? bean // + : this.configurer.getObject().registerHypermediaTypes(((WebClient) bean).mutate()).build(); } } } diff --git a/src/main/java/org/springframework/hateoas/config/WebFluxHateoasConfiguration.java b/src/main/java/org/springframework/hateoas/config/WebFluxHateoasConfiguration.java index e29ef05f..e01b474a 100644 --- a/src/main/java/org/springframework/hateoas/config/WebFluxHateoasConfiguration.java +++ b/src/main/java/org/springframework/hateoas/config/WebFluxHateoasConfiguration.java @@ -44,7 +44,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; * @author Oliver Drotbohm * @since 1.0 */ -@Configuration +@Configuration(proxyBeanMethods = false) class WebFluxHateoasConfiguration { @Bean diff --git a/src/main/java/org/springframework/hateoas/config/WebMvcEntityLinksConfiguration.java b/src/main/java/org/springframework/hateoas/config/WebMvcEntityLinksConfiguration.java index f10256c5..0b8f8070 100644 --- a/src/main/java/org/springframework/hateoas/config/WebMvcEntityLinksConfiguration.java +++ b/src/main/java/org/springframework/hateoas/config/WebMvcEntityLinksConfiguration.java @@ -29,7 +29,7 @@ import org.springframework.stereotype.Controller; * @author Greg Turnquist * @author Oliver Gierke */ -@Configuration +@Configuration(proxyBeanMethods = false) class WebMvcEntityLinksConfiguration extends EntityLinksConfiguration { @Bean diff --git a/src/main/java/org/springframework/hateoas/config/WebMvcHateoasConfiguration.java b/src/main/java/org/springframework/hateoas/config/WebMvcHateoasConfiguration.java index be4eb341..4ad7cff9 100644 --- a/src/main/java/org/springframework/hateoas/config/WebMvcHateoasConfiguration.java +++ b/src/main/java/org/springframework/hateoas/config/WebMvcHateoasConfiguration.java @@ -44,7 +44,7 @@ import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandl * @author Greg Turnquist * @author Oliver Drotbohm */ -@Configuration +@Configuration(proxyBeanMethods = false) @Import(WebMvcEntityLinksConfiguration.class) class WebMvcHateoasConfiguration { diff --git a/src/main/java/org/springframework/hateoas/mediatype/hal/HalMediaTypeConfiguration.java b/src/main/java/org/springframework/hateoas/mediatype/hal/HalMediaTypeConfiguration.java index 7c02a760..6bf15898 100644 --- a/src/main/java/org/springframework/hateoas/mediatype/hal/HalMediaTypeConfiguration.java +++ b/src/main/java/org/springframework/hateoas/mediatype/hal/HalMediaTypeConfiguration.java @@ -40,7 +40,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; * @author Greg Turnquist * @author Oliver Drotbohm */ -@Configuration +@Configuration(proxyBeanMethods = false) @RequiredArgsConstructor public class HalMediaTypeConfiguration implements HypermediaMappingInformation {