Skip to content

Commit d3b244a

Browse files
committed
Optimize class detection by sharing the ClassLoader
Issue: SPR-17083
1 parent 32faf09 commit d3b244a

File tree

15 files changed

+222
-197
lines changed

15 files changed

+222
-197
lines changed

spring-context/src/main/java/org/springframework/cache/annotation/CachingConfigurationSelector.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,11 +50,15 @@ public class CachingConfigurationSelector extends AdviceModeImportSelector<Enabl
5050
"org.springframework.cache.aspectj.AspectJJCacheConfiguration";
5151

5252

53-
private static final boolean jsr107Present = ClassUtils.isPresent(
54-
"javax.cache.Cache", CachingConfigurationSelector.class.getClassLoader());
53+
private static final boolean jsr107Present;
5554

56-
private static final boolean jcacheImplPresent = ClassUtils.isPresent(
57-
PROXY_JCACHE_CONFIGURATION_CLASS, CachingConfigurationSelector.class.getClassLoader());
55+
private static final boolean jcacheImplPresent;
56+
57+
static {
58+
ClassLoader classLoader = CachingConfigurationSelector.class.getClassLoader();
59+
jsr107Present = ClassUtils.isPresent("javax.cache.Cache", classLoader);
60+
jcacheImplPresent = ClassUtils.isPresent(PROXY_JCACHE_CONFIGURATION_CLASS, classLoader);
61+
}
5862

5963

6064
/**

spring-context/src/main/java/org/springframework/cache/config/AnnotationDrivenCacheBeanDefinitionParser.java

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -61,12 +61,16 @@ class AnnotationDrivenCacheBeanDefinitionParser implements BeanDefinitionParser
6161
private static final String JCACHE_ASPECT_CLASS_NAME =
6262
"org.springframework.cache.aspectj.JCacheCacheAspect";
6363

64-
private static final boolean jsr107Present = ClassUtils.isPresent(
65-
"javax.cache.Cache", AnnotationDrivenCacheBeanDefinitionParser.class.getClassLoader());
64+
private static final boolean jsr107Present;
6665

67-
private static final boolean jcacheImplPresent = ClassUtils.isPresent(
68-
"org.springframework.cache.jcache.interceptor.DefaultJCacheOperationSource",
69-
AnnotationDrivenCacheBeanDefinitionParser.class.getClassLoader());
66+
private static final boolean jcacheImplPresent;
67+
68+
static {
69+
ClassLoader classLoader = AnnotationDrivenCacheBeanDefinitionParser.class.getClassLoader();
70+
jsr107Present = ClassUtils.isPresent("javax.cache.Cache", classLoader);
71+
jcacheImplPresent = ClassUtils.isPresent(
72+
"org.springframework.cache.jcache.interceptor.DefaultJCacheOperationSource", classLoader);
73+
}
7074

7175

7276
/**

spring-context/src/main/java/org/springframework/context/annotation/AnnotationConfigUtils.java

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -118,12 +118,16 @@ public abstract class AnnotationConfigUtils {
118118
public static final String EVENT_LISTENER_FACTORY_BEAN_NAME =
119119
"org.springframework.context.event.internalEventListenerFactory";
120120

121-
private static final boolean jsr250Present =
122-
ClassUtils.isPresent("javax.annotation.Resource", AnnotationConfigUtils.class.getClassLoader());
121+
private static final boolean jsr250Present;
123122

124-
private static final boolean jpaPresent =
125-
ClassUtils.isPresent("javax.persistence.EntityManagerFactory", AnnotationConfigUtils.class.getClassLoader()) &&
126-
ClassUtils.isPresent(PERSISTENCE_ANNOTATION_PROCESSOR_CLASS_NAME, AnnotationConfigUtils.class.getClassLoader());
123+
private static final boolean jpaPresent;
124+
125+
static {
126+
ClassLoader classLoader = AnnotationConfigUtils.class.getClassLoader();
127+
jsr250Present = ClassUtils.isPresent("javax.annotation.Resource", classLoader);
128+
jpaPresent = ClassUtils.isPresent("javax.persistence.EntityManagerFactory", classLoader) &&
129+
ClassUtils.isPresent(PERSISTENCE_ANNOTATION_PROCESSOR_CLASS_NAME, classLoader);
130+
}
127131

128132

129133
/**

spring-context/src/main/java/org/springframework/context/config/MBeanServerBeanDefinitionParser.java

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2017 the original author or authors.
2+
* Copyright 2002-2018 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -49,11 +49,15 @@ class MBeanServerBeanDefinitionParser extends AbstractBeanDefinitionParser {
4949
private static final String AGENT_ID_ATTRIBUTE = "agent-id";
5050

5151

52-
private static final boolean weblogicPresent = ClassUtils.isPresent(
53-
"weblogic.management.Helper", MBeanServerBeanDefinitionParser.class.getClassLoader());
52+
private static final boolean weblogicPresent;
5453

55-
private static final boolean webspherePresent = ClassUtils.isPresent(
56-
"com.ibm.websphere.management.AdminServiceFactory", MBeanServerBeanDefinitionParser.class.getClassLoader());
54+
private static final boolean webspherePresent;
55+
56+
static {
57+
ClassLoader classLoader = MBeanServerBeanDefinitionParser.class.getClassLoader();
58+
weblogicPresent = ClassUtils.isPresent("weblogic.management.Helper", classLoader);
59+
webspherePresent = ClassUtils.isPresent("com.ibm.websphere.management.AdminServiceFactory", classLoader);
60+
}
5761

5862

5963
@Override

spring-context/src/main/java/org/springframework/format/support/DefaultFormattingConversionService.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,11 +47,15 @@
4747
*/
4848
public class DefaultFormattingConversionService extends FormattingConversionService {
4949

50-
private static final boolean jsr354Present = ClassUtils.isPresent(
51-
"javax.money.MonetaryAmount", DefaultFormattingConversionService.class.getClassLoader());
50+
private static final boolean jsr354Present;
5251

53-
private static final boolean jodaTimePresent = ClassUtils.isPresent(
54-
"org.joda.time.LocalDate", DefaultFormattingConversionService.class.getClassLoader());
52+
private static final boolean jodaTimePresent;
53+
54+
static {
55+
ClassLoader classLoader = DefaultFormattingConversionService.class.getClassLoader();
56+
jsr354Present = ClassUtils.isPresent("javax.money.MonetaryAmount", classLoader);
57+
jodaTimePresent = ClassUtils.isPresent("org.joda.time.LocalDate", classLoader);
58+
}
5559

5660

5761
/**

spring-tx/src/main/java/org/springframework/transaction/annotation/AnnotationTransactionAttributeSource.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,11 +55,15 @@
5555
public class AnnotationTransactionAttributeSource extends AbstractFallbackTransactionAttributeSource
5656
implements Serializable {
5757

58-
private static final boolean jta12Present = ClassUtils.isPresent(
59-
"javax.transaction.Transactional", AnnotationTransactionAttributeSource.class.getClassLoader());
58+
private static final boolean jta12Present;
6059

61-
private static final boolean ejb3Present = ClassUtils.isPresent(
62-
"javax.ejb.TransactionAttribute", AnnotationTransactionAttributeSource.class.getClassLoader());
60+
private static final boolean ejb3Present;
61+
62+
static {
63+
ClassLoader classLoader = AnnotationTransactionAttributeSource.class.getClassLoader();
64+
jta12Present = ClassUtils.isPresent("javax.transaction.Transactional", classLoader);
65+
ejb3Present = ClassUtils.isPresent("javax.ejb.TransactionAttribute", classLoader);
66+
}
6367

6468
private final boolean publicMethodsOnly;
6569

spring-tx/src/main/java/org/springframework/transaction/config/JtaTransactionManagerFactoryBean.java

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2017 the original author or authors.
2+
* Copyright 2002-2018 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -44,11 +44,15 @@ public class JtaTransactionManagerFactoryBean implements FactoryBean<JtaTransact
4444
"org.springframework.transaction.jta.JtaTransactionManager";
4545

4646

47-
private static final boolean weblogicPresent = ClassUtils.isPresent(
48-
"weblogic.transaction.UserTransaction", JtaTransactionManagerFactoryBean.class.getClassLoader());
47+
private static final boolean weblogicPresent;
4948

50-
private static final boolean webspherePresent = ClassUtils.isPresent(
51-
"com.ibm.wsspi.uow.UOWManager", JtaTransactionManagerFactoryBean.class.getClassLoader());
49+
private static final boolean webspherePresent;
50+
51+
static {
52+
ClassLoader classLoader = JtaTransactionManagerFactoryBean.class.getClassLoader();
53+
weblogicPresent = ClassUtils.isPresent("weblogic.transaction.UserTransaction", classLoader);
54+
webspherePresent = ClassUtils.isPresent("com.ibm.wsspi.uow.UOWManager", classLoader);
55+
}
5256

5357

5458
@Nullable

spring-web/src/main/java/org/springframework/http/codec/support/BaseDefaultCodecs.java

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -56,23 +56,22 @@
5656
*/
5757
class BaseDefaultCodecs implements CodecConfigurer.DefaultCodecs {
5858

59-
private static final ClassLoader classLoader = BaseCodecConfigurer.class.getClassLoader();
59+
static final boolean jackson2Present;
6060

61-
static final boolean jackson2Present =
62-
ClassUtils.isPresent("com.fasterxml.jackson.databind.ObjectMapper",
63-
BaseCodecConfigurer.class.getClassLoader()) &&
64-
ClassUtils.isPresent("com.fasterxml.jackson.core.JsonGenerator",
65-
classLoader);
61+
private static final boolean jackson2SmilePresent;
6662

67-
private static final boolean jackson2SmilePresent =
68-
ClassUtils.isPresent("com.fasterxml.jackson.dataformat.smile.SmileFactory",
69-
classLoader);
63+
private static final boolean jaxb2Present;
7064

71-
private static final boolean jaxb2Present =
72-
ClassUtils.isPresent("javax.xml.bind.Binder", classLoader);
65+
private static final boolean protobufPresent;
7366

74-
private static final boolean protobufPresent =
75-
ClassUtils.isPresent("com.google.protobuf.Message", classLoader);
67+
static {
68+
ClassLoader classLoader = BaseCodecConfigurer.class.getClassLoader();
69+
jackson2Present = ClassUtils.isPresent("com.fasterxml.jackson.databind.ObjectMapper", classLoader) &&
70+
ClassUtils.isPresent("com.fasterxml.jackson.core.JsonGenerator", classLoader);
71+
jackson2SmilePresent = ClassUtils.isPresent("com.fasterxml.jackson.dataformat.smile.SmileFactory", classLoader);
72+
jaxb2Present = ClassUtils.isPresent("javax.xml.bind.Binder", classLoader);
73+
protobufPresent = ClassUtils.isPresent("com.google.protobuf.Message", classLoader);
74+
}
7675

7776

7877
@Nullable

spring-web/src/main/java/org/springframework/http/converter/support/AllEncompassingFormHttpMessageConverter.java

Lines changed: 22 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -36,31 +36,28 @@
3636
*/
3737
public class AllEncompassingFormHttpMessageConverter extends FormHttpMessageConverter {
3838

39-
private static final boolean jaxb2Present =
40-
ClassUtils.isPresent("javax.xml.bind.Binder",
41-
AllEncompassingFormHttpMessageConverter.class.getClassLoader());
42-
43-
private static final boolean jackson2Present =
44-
ClassUtils.isPresent("com.fasterxml.jackson.databind.ObjectMapper",
45-
AllEncompassingFormHttpMessageConverter.class.getClassLoader()) &&
46-
ClassUtils.isPresent("com.fasterxml.jackson.core.JsonGenerator",
47-
AllEncompassingFormHttpMessageConverter.class.getClassLoader());
48-
49-
private static final boolean jackson2XmlPresent =
50-
ClassUtils.isPresent("com.fasterxml.jackson.dataformat.xml.XmlMapper",
51-
AllEncompassingFormHttpMessageConverter.class.getClassLoader());
52-
53-
private static final boolean jackson2SmilePresent =
54-
ClassUtils.isPresent("com.fasterxml.jackson.dataformat.smile.SmileFactory",
55-
AllEncompassingFormHttpMessageConverter.class.getClassLoader());
56-
57-
private static final boolean gsonPresent =
58-
ClassUtils.isPresent("com.google.gson.Gson",
59-
AllEncompassingFormHttpMessageConverter.class.getClassLoader());
60-
61-
private static final boolean jsonbPresent =
62-
ClassUtils.isPresent("javax.json.bind.Jsonb",
63-
AllEncompassingFormHttpMessageConverter.class.getClassLoader());
39+
private static final boolean jaxb2Present;
40+
41+
private static final boolean jackson2Present;
42+
43+
private static final boolean jackson2XmlPresent;
44+
45+
private static final boolean jackson2SmilePresent;
46+
47+
private static final boolean gsonPresent;
48+
49+
private static final boolean jsonbPresent;
50+
51+
static {
52+
ClassLoader classLoader = AllEncompassingFormHttpMessageConverter.class.getClassLoader();
53+
jaxb2Present = ClassUtils.isPresent("javax.xml.bind.Binder", classLoader);
54+
jackson2Present = ClassUtils.isPresent("com.fasterxml.jackson.databind.ObjectMapper", classLoader) &&
55+
ClassUtils.isPresent("com.fasterxml.jackson.core.JsonGenerator", classLoader);
56+
jackson2XmlPresent = ClassUtils.isPresent("com.fasterxml.jackson.dataformat.xml.XmlMapper", classLoader);
57+
jackson2SmilePresent = ClassUtils.isPresent("com.fasterxml.jackson.dataformat.smile.SmileFactory", classLoader);
58+
gsonPresent = ClassUtils.isPresent("com.google.gson.Gson", classLoader);
59+
jsonbPresent = ClassUtils.isPresent("javax.json.bind.Jsonb", classLoader);
60+
}
6461

6562

6663
public AllEncompassingFormHttpMessageConverter() {

spring-web/src/main/java/org/springframework/web/client/RestTemplate.java

Lines changed: 29 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -127,39 +127,35 @@
127127
*/
128128
public class RestTemplate extends InterceptingHttpAccessor implements RestOperations {
129129

130-
private static boolean romePresent =
131-
ClassUtils.isPresent("com.rometools.rome.feed.WireFeed",
132-
RestTemplate.class.getClassLoader());
133-
134-
private static final boolean jaxb2Present =
135-
ClassUtils.isPresent("javax.xml.bind.Binder",
136-
RestTemplate.class.getClassLoader());
137-
138-
private static final boolean jackson2Present =
139-
ClassUtils.isPresent("com.fasterxml.jackson.databind.ObjectMapper",
140-
RestTemplate.class.getClassLoader()) &&
141-
ClassUtils.isPresent("com.fasterxml.jackson.core.JsonGenerator",
142-
RestTemplate.class.getClassLoader());
143-
144-
private static final boolean jackson2XmlPresent =
145-
ClassUtils.isPresent("com.fasterxml.jackson.dataformat.xml.XmlMapper",
146-
RestTemplate.class.getClassLoader());
147-
148-
private static final boolean jackson2SmilePresent =
149-
ClassUtils.isPresent("com.fasterxml.jackson.dataformat.smile.SmileFactory",
150-
RestTemplate.class.getClassLoader());
151-
152-
private static final boolean jackson2CborPresent =
153-
ClassUtils.isPresent("com.fasterxml.jackson.dataformat.cbor.CBORFactory",
154-
RestTemplate.class.getClassLoader());
155-
156-
private static final boolean gsonPresent =
157-
ClassUtils.isPresent("com.google.gson.Gson",
158-
RestTemplate.class.getClassLoader());
159-
160-
private static final boolean jsonbPresent =
161-
ClassUtils.isPresent("javax.json.bind.Jsonb",
162-
RestTemplate.class.getClassLoader());
130+
private static boolean romePresent;
131+
132+
private static final boolean jaxb2Present;
133+
134+
private static final boolean jackson2Present;
135+
136+
private static final boolean jackson2XmlPresent;
137+
138+
private static final boolean jackson2SmilePresent;
139+
140+
private static final boolean jackson2CborPresent;
141+
142+
private static final boolean gsonPresent;
143+
144+
private static final boolean jsonbPresent;
145+
146+
static {
147+
ClassLoader classLoader = RestTemplate.class.getClassLoader();
148+
romePresent = ClassUtils.isPresent("com.rometools.rome.feed.WireFeed", classLoader);
149+
jaxb2Present = ClassUtils.isPresent("javax.xml.bind.Binder", classLoader);
150+
jackson2Present =
151+
ClassUtils.isPresent("com.fasterxml.jackson.databind.ObjectMapper", classLoader) &&
152+
ClassUtils.isPresent("com.fasterxml.jackson.core.JsonGenerator", classLoader);
153+
jackson2XmlPresent = ClassUtils.isPresent("com.fasterxml.jackson.dataformat.xml.XmlMapper", classLoader);
154+
jackson2SmilePresent = ClassUtils.isPresent("com.fasterxml.jackson.dataformat.smile.SmileFactory", classLoader);
155+
jackson2CborPresent = ClassUtils.isPresent("com.fasterxml.jackson.dataformat.cbor.CBORFactory", classLoader);
156+
gsonPresent = ClassUtils.isPresent("com.google.gson.Gson", classLoader);
157+
jsonbPresent = ClassUtils.isPresent("javax.json.bind.Jsonb", classLoader);
158+
}
163159

164160

165161
private final List<HttpMessageConverter<?>> messageConverters = new ArrayList<>();

spring-webflux/src/main/java/org/springframework/web/reactive/socket/server/support/HandshakeWebSocketService.java

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -63,21 +63,21 @@ public class HandshakeWebSocketService implements WebSocketService, Lifecycle {
6363
private static final Mono<Map<String, Object>> EMPTY_ATTRIBUTES = Mono.just(Collections.emptyMap());
6464

6565

66-
private static final boolean tomcatPresent = ClassUtils.isPresent(
67-
"org.apache.tomcat.websocket.server.WsHttpUpgradeHandler",
68-
HandshakeWebSocketService.class.getClassLoader());
66+
private static final boolean tomcatPresent;
6967

70-
private static final boolean jettyPresent = ClassUtils.isPresent(
71-
"org.eclipse.jetty.websocket.server.WebSocketServerFactory",
72-
HandshakeWebSocketService.class.getClassLoader());
68+
private static final boolean jettyPresent;
7369

74-
private static final boolean undertowPresent = ClassUtils.isPresent(
75-
"io.undertow.websockets.WebSocketProtocolHandshakeHandler",
76-
HandshakeWebSocketService.class.getClassLoader());
70+
private static final boolean undertowPresent;
7771

78-
private static final boolean reactorNettyPresent = ClassUtils.isPresent(
79-
"reactor.netty.http.server.HttpServerResponse",
80-
HandshakeWebSocketService.class.getClassLoader());
72+
private static final boolean reactorNettyPresent;
73+
74+
static {
75+
ClassLoader classLoader = HandshakeWebSocketService.class.getClassLoader();
76+
tomcatPresent = ClassUtils.isPresent("org.apache.tomcat.websocket.server.WsHttpUpgradeHandler", classLoader);
77+
jettyPresent = ClassUtils.isPresent("org.eclipse.jetty.websocket.server.WebSocketServerFactory", classLoader);
78+
undertowPresent = ClassUtils.isPresent("io.undertow.websockets.WebSocketProtocolHandshakeHandler", classLoader);
79+
reactorNettyPresent = ClassUtils.isPresent("reactor.netty.http.server.HttpServerResponse", classLoader);
80+
}
8181

8282

8383
protected static final Log logger = LogFactory.getLog(HandshakeWebSocketService.class);

0 commit comments

Comments
 (0)