From d3b244a81b6daae152e0f8dc2d5980eef461af12 Mon Sep 17 00:00:00 2001 From: Sebastien Deleuze Date: Wed, 25 Jul 2018 10:55:07 +0200 Subject: [PATCH] Optimize class detection by sharing the ClassLoader Issue: SPR-17083 --- .../CachingConfigurationSelector.java | 12 +++-- ...tationDrivenCacheBeanDefinitionParser.java | 14 ++++-- .../annotation/AnnotationConfigUtils.java | 14 ++++-- .../MBeanServerBeanDefinitionParser.java | 14 ++++-- .../DefaultFormattingConversionService.java | 12 +++-- .../AnnotationTransactionAttributeSource.java | 12 +++-- .../JtaTransactionManagerFactoryBean.java | 14 ++++-- .../http/codec/support/BaseDefaultCodecs.java | 25 +++++----- ...lEncompassingFormHttpMessageConverter.java | 37 +++++++------- .../web/client/RestTemplate.java | 48 +++++++++---------- .../support/HandshakeWebSocketService.java | 24 +++++----- .../AnnotationDrivenBeanDefinitionParser.java | 47 ++++++++---------- .../WebMvcConfigurationSupport.java | 47 ++++++++---------- .../MessageBrokerBeanDefinitionParser.java | 12 +++-- .../support/AbstractHandshakeHandler.java | 35 +++++++++----- 15 files changed, 196 insertions(+), 171 deletions(-) diff --git a/spring-context/src/main/java/org/springframework/cache/annotation/CachingConfigurationSelector.java b/spring-context/src/main/java/org/springframework/cache/annotation/CachingConfigurationSelector.java index 7d5149b08a..6478438792 100644 --- a/spring-context/src/main/java/org/springframework/cache/annotation/CachingConfigurationSelector.java +++ b/spring-context/src/main/java/org/springframework/cache/annotation/CachingConfigurationSelector.java @@ -50,11 +50,15 @@ public class CachingConfigurationSelector extends AdviceModeImportSelector> messageConverters = new ArrayList<>(); diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/socket/server/support/HandshakeWebSocketService.java b/spring-webflux/src/main/java/org/springframework/web/reactive/socket/server/support/HandshakeWebSocketService.java index 9aba095bf4..e9d7e3bee2 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/socket/server/support/HandshakeWebSocketService.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/socket/server/support/HandshakeWebSocketService.java @@ -63,21 +63,21 @@ public class HandshakeWebSocketService implements WebSocketService, Lifecycle { private static final Mono> EMPTY_ATTRIBUTES = Mono.just(Collections.emptyMap()); - private static final boolean tomcatPresent = ClassUtils.isPresent( - "org.apache.tomcat.websocket.server.WsHttpUpgradeHandler", - HandshakeWebSocketService.class.getClassLoader()); + private static final boolean tomcatPresent; - private static final boolean jettyPresent = ClassUtils.isPresent( - "org.eclipse.jetty.websocket.server.WebSocketServerFactory", - HandshakeWebSocketService.class.getClassLoader()); + private static final boolean jettyPresent; - private static final boolean undertowPresent = ClassUtils.isPresent( - "io.undertow.websockets.WebSocketProtocolHandshakeHandler", - HandshakeWebSocketService.class.getClassLoader()); + private static final boolean undertowPresent; - private static final boolean reactorNettyPresent = ClassUtils.isPresent( - "reactor.netty.http.server.HttpServerResponse", - HandshakeWebSocketService.class.getClassLoader()); + private static final boolean reactorNettyPresent; + + static { + ClassLoader classLoader = HandshakeWebSocketService.class.getClassLoader(); + tomcatPresent = ClassUtils.isPresent("org.apache.tomcat.websocket.server.WsHttpUpgradeHandler", classLoader); + jettyPresent = ClassUtils.isPresent("org.eclipse.jetty.websocket.server.WebSocketServerFactory", classLoader); + undertowPresent = ClassUtils.isPresent("io.undertow.websockets.WebSocketProtocolHandshakeHandler", classLoader); + reactorNettyPresent = ClassUtils.isPresent("reactor.netty.http.server.HttpServerResponse", classLoader); + } protected static final Log logger = LogFactory.getLog(HandshakeWebSocketService.class); diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/AnnotationDrivenBeanDefinitionParser.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/AnnotationDrivenBeanDefinitionParser.java index b676596a2c..35698abb6c 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/AnnotationDrivenBeanDefinitionParser.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/AnnotationDrivenBeanDefinitionParser.java @@ -160,39 +160,34 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser { public static final String CONTENT_NEGOTIATION_MANAGER_BEAN_NAME = "mvcContentNegotiationManager"; - private static final boolean javaxValidationPresent = - ClassUtils.isPresent("javax.validation.Validator", - AnnotationDrivenBeanDefinitionParser.class.getClassLoader()); + private static final boolean javaxValidationPresent; - private static boolean romePresent = - ClassUtils.isPresent("com.rometools.rome.feed.WireFeed", - AnnotationDrivenBeanDefinitionParser.class.getClassLoader()); + private static boolean romePresent; - private static final boolean jaxb2Present = - ClassUtils.isPresent("javax.xml.bind.Binder", - AnnotationDrivenBeanDefinitionParser.class.getClassLoader()); + private static final boolean jaxb2Present; - private static final boolean jackson2Present = - ClassUtils.isPresent("com.fasterxml.jackson.databind.ObjectMapper", - AnnotationDrivenBeanDefinitionParser.class.getClassLoader()) && - ClassUtils.isPresent("com.fasterxml.jackson.core.JsonGenerator", - AnnotationDrivenBeanDefinitionParser.class.getClassLoader()); + private static final boolean jackson2Present; - private static final boolean jackson2XmlPresent = - ClassUtils.isPresent("com.fasterxml.jackson.dataformat.xml.XmlMapper", - AnnotationDrivenBeanDefinitionParser.class.getClassLoader()); + private static final boolean jackson2XmlPresent; - private static final boolean jackson2SmilePresent = - ClassUtils.isPresent("com.fasterxml.jackson.dataformat.smile.SmileFactory", - AnnotationDrivenBeanDefinitionParser.class.getClassLoader()); + private static final boolean jackson2SmilePresent; - private static final boolean jackson2CborPresent = - ClassUtils.isPresent("com.fasterxml.jackson.dataformat.cbor.CBORFactory", - AnnotationDrivenBeanDefinitionParser.class.getClassLoader()); + private static final boolean jackson2CborPresent; - private static final boolean gsonPresent = - ClassUtils.isPresent("com.google.gson.Gson", - AnnotationDrivenBeanDefinitionParser.class.getClassLoader()); + private static final boolean gsonPresent; + + static { + ClassLoader classLoader = AnnotationDrivenBeanDefinitionParser.class.getClassLoader(); + javaxValidationPresent = ClassUtils.isPresent("javax.validation.Validator", classLoader); + romePresent = ClassUtils.isPresent("com.rometools.rome.feed.WireFeed", classLoader); + jaxb2Present = ClassUtils.isPresent("javax.xml.bind.Binder", classLoader); + jackson2Present = ClassUtils.isPresent("com.fasterxml.jackson.databind.ObjectMapper", classLoader) && + ClassUtils.isPresent("com.fasterxml.jackson.core.JsonGenerator", classLoader); + jackson2XmlPresent = ClassUtils.isPresent("com.fasterxml.jackson.dataformat.xml.XmlMapper", classLoader); + jackson2SmilePresent = ClassUtils.isPresent("com.fasterxml.jackson.dataformat.smile.SmileFactory", classLoader); + jackson2CborPresent = ClassUtils.isPresent("com.fasterxml.jackson.dataformat.cbor.CBORFactory", classLoader); + gsonPresent = ClassUtils.isPresent("com.google.gson.Gson", classLoader); + } @Override diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupport.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupport.java index 5d2b5ddae7..361f2610f6 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupport.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupport.java @@ -172,39 +172,34 @@ import org.springframework.web.util.UrlPathHelper; */ public class WebMvcConfigurationSupport implements ApplicationContextAware, ServletContextAware { - private static boolean romePresent = - ClassUtils.isPresent("com.rometools.rome.feed.WireFeed", - WebMvcConfigurationSupport.class.getClassLoader()); + private static boolean romePresent; - private static final boolean jaxb2Present = - ClassUtils.isPresent("javax.xml.bind.Binder", - WebMvcConfigurationSupport.class.getClassLoader()); + private static final boolean jaxb2Present; - private static final boolean jackson2Present = - ClassUtils.isPresent("com.fasterxml.jackson.databind.ObjectMapper", - WebMvcConfigurationSupport.class.getClassLoader()) && - ClassUtils.isPresent("com.fasterxml.jackson.core.JsonGenerator", - WebMvcConfigurationSupport.class.getClassLoader()); + private static final boolean jackson2Present; - private static final boolean jackson2XmlPresent = - ClassUtils.isPresent("com.fasterxml.jackson.dataformat.xml.XmlMapper", - WebMvcConfigurationSupport.class.getClassLoader()); + private static final boolean jackson2XmlPresent; - private static final boolean jackson2SmilePresent = - ClassUtils.isPresent("com.fasterxml.jackson.dataformat.smile.SmileFactory", - WebMvcConfigurationSupport.class.getClassLoader()); + private static final boolean jackson2SmilePresent; - private static final boolean jackson2CborPresent = - ClassUtils.isPresent("com.fasterxml.jackson.dataformat.cbor.CBORFactory", - WebMvcConfigurationSupport.class.getClassLoader()); + private static final boolean jackson2CborPresent; - private static final boolean gsonPresent = - ClassUtils.isPresent("com.google.gson.Gson", - WebMvcConfigurationSupport.class.getClassLoader()); + private static final boolean gsonPresent; - private static final boolean jsonbPresent = - ClassUtils.isPresent("javax.json.bind.Jsonb", - WebMvcConfigurationSupport.class.getClassLoader()); + private static final boolean jsonbPresent; + + static { + ClassLoader classLoader = WebMvcConfigurationSupport.class.getClassLoader(); + romePresent = ClassUtils.isPresent("com.rometools.rome.feed.WireFeed", classLoader); + jaxb2Present = ClassUtils.isPresent("javax.xml.bind.Binder", classLoader); + jackson2Present = ClassUtils.isPresent("com.fasterxml.jackson.databind.ObjectMapper", classLoader) && + ClassUtils.isPresent("com.fasterxml.jackson.core.JsonGenerator", classLoader); + jackson2XmlPresent = ClassUtils.isPresent("com.fasterxml.jackson.dataformat.xml.XmlMapper", classLoader); + jackson2SmilePresent = ClassUtils.isPresent("com.fasterxml.jackson.dataformat.smile.SmileFactory", classLoader); + jackson2CborPresent = ClassUtils.isPresent("com.fasterxml.jackson.dataformat.cbor.CBORFactory", classLoader); + gsonPresent = ClassUtils.isPresent("com.google.gson.Gson", classLoader); + jsonbPresent = ClassUtils.isPresent("javax.json.bind.Jsonb", classLoader); + } @Nullable diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/config/MessageBrokerBeanDefinitionParser.java b/spring-websocket/src/main/java/org/springframework/web/socket/config/MessageBrokerBeanDefinitionParser.java index 4f5cefff3d..1261e027ce 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/config/MessageBrokerBeanDefinitionParser.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/config/MessageBrokerBeanDefinitionParser.java @@ -111,11 +111,15 @@ class MessageBrokerBeanDefinitionParser implements BeanDefinitionParser { private static final int DEFAULT_MAPPING_ORDER = 1; - private static final boolean jackson2Present = ClassUtils.isPresent( - "com.fasterxml.jackson.databind.ObjectMapper", MessageBrokerBeanDefinitionParser.class.getClassLoader()); + private static final boolean jackson2Present; - private static final boolean javaxValidationPresent = - ClassUtils.isPresent("javax.validation.Validator", MessageBrokerBeanDefinitionParser.class.getClassLoader()); + private static final boolean javaxValidationPresent; + + static { + ClassLoader classLoader = MessageBrokerBeanDefinitionParser.class.getClassLoader(); + jackson2Present = ClassUtils.isPresent("com.fasterxml.jackson.databind.ObjectMapper", classLoader); + javaxValidationPresent = ClassUtils.isPresent("javax.validation.Validator", classLoader); + } @Override diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/server/support/AbstractHandshakeHandler.java b/spring-websocket/src/main/java/org/springframework/web/socket/server/support/AbstractHandshakeHandler.java index ff4992e931..a9da0d11c3 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/server/support/AbstractHandshakeHandler.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/server/support/AbstractHandshakeHandler.java @@ -71,23 +71,34 @@ import org.springframework.web.socket.server.RequestUpgradeStrategy; */ public abstract class AbstractHandshakeHandler implements HandshakeHandler, Lifecycle { - private static final boolean jettyWsPresent = ClassUtils.isPresent( - "org.eclipse.jetty.websocket.server.WebSocketServerFactory", AbstractHandshakeHandler.class.getClassLoader()); + private static final boolean jettyWsPresent; - private static final boolean tomcatWsPresent = ClassUtils.isPresent( - "org.apache.tomcat.websocket.server.WsHttpUpgradeHandler", AbstractHandshakeHandler.class.getClassLoader()); + private static final boolean tomcatWsPresent; - private static final boolean undertowWsPresent = ClassUtils.isPresent( - "io.undertow.websockets.jsr.ServerWebSocketContainer", AbstractHandshakeHandler.class.getClassLoader()); + private static final boolean undertowWsPresent; - private static final boolean glassfishWsPresent = ClassUtils.isPresent( - "org.glassfish.tyrus.servlet.TyrusHttpUpgradeHandler", AbstractHandshakeHandler.class.getClassLoader()); + private static final boolean glassfishWsPresent; - private static final boolean weblogicWsPresent = ClassUtils.isPresent( - "weblogic.websocket.tyrus.TyrusServletWriter", AbstractHandshakeHandler.class.getClassLoader()); + private static final boolean weblogicWsPresent; - private static final boolean websphereWsPresent = ClassUtils.isPresent( - "com.ibm.websphere.wsoc.WsWsocServerContainer", AbstractHandshakeHandler.class.getClassLoader()); + private static final boolean websphereWsPresent; + + static { + ClassLoader classLoader = AbstractHandshakeHandler.class.getClassLoader(); + jettyWsPresent = ClassUtils.isPresent( + "org.eclipse.jetty.websocket.server.WebSocketServerFactory", classLoader); + tomcatWsPresent = ClassUtils.isPresent( + "org.apache.tomcat.websocket.server.WsHttpUpgradeHandler", classLoader); + undertowWsPresent = ClassUtils.isPresent( + "io.undertow.websockets.jsr.ServerWebSocketContainer", classLoader); + glassfishWsPresent = ClassUtils.isPresent( + "org.glassfish.tyrus.servlet.TyrusHttpUpgradeHandler", classLoader); + weblogicWsPresent = ClassUtils.isPresent( + "weblogic.websocket.tyrus.TyrusServletWriter", classLoader); + websphereWsPresent = ClassUtils.isPresent( + "com.ibm.websphere.wsoc.WsWsocServerContainer", classLoader); + + } protected final Log logger = LogFactory.getLog(getClass());