Skip to content

Commit 426ff3a

Browse files
committed
Store ObjectProvider rather than their Streams to allow reuse
Generally speaking, methods on configuration classes will only be called once and, therefore, it should be safe to hold a reference to a Stream for later one-time usage. However, there are some scenarios in Spring Fu where functional registration results in an attempt being made to use a Stream more than use. This commit protects against multiple use by storing the ObjectProvider and getting a new ordered Stream each time it's needed. Closes gh-14467
1 parent cc6cf88 commit 426ff3a

File tree

12 files changed

+54
-62
lines changed

12 files changed

+54
-62
lines changed

spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/web/jersey/JerseyManagementChildContextConfiguration.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,6 @@
1616

1717
package org.springframework.boot.actuate.autoconfigure.web.jersey;
1818

19-
import java.util.stream.Stream;
20-
2119
import org.glassfish.jersey.server.ResourceConfig;
2220
import org.glassfish.jersey.servlet.ServletContainer;
2321

@@ -47,11 +45,11 @@
4745
@ConditionalOnMissingClass("org.springframework.web.servlet.DispatcherServlet")
4846
public class JerseyManagementChildContextConfiguration {
4947

50-
private final Stream<ResourceConfigCustomizer> resourceConfigCustomizers;
48+
private final ObjectProvider<ResourceConfigCustomizer> resourceConfigCustomizers;
5149

5250
public JerseyManagementChildContextConfiguration(
5351
ObjectProvider<ResourceConfigCustomizer> resourceConfigCustomizers) {
54-
this.resourceConfigCustomizers = resourceConfigCustomizers.orderedStream();
52+
this.resourceConfigCustomizers = resourceConfigCustomizers;
5553
}
5654

5755
@Bean
@@ -63,7 +61,7 @@ public ServletRegistrationBean<ServletContainer> jerseyServletRegistration() {
6361
@Bean
6462
public ResourceConfig endpointResourceConfig() {
6563
ResourceConfig resourceConfig = new ResourceConfig();
66-
this.resourceConfigCustomizers
64+
this.resourceConfigCustomizers.orderedStream()
6765
.forEach((customizer) -> customizer.customize(resourceConfig));
6866
return resourceConfig;
6967
}

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cache/JCacheCacheConfiguration.java

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
import java.util.Iterator;
2121
import java.util.List;
2222
import java.util.Properties;
23-
import java.util.stream.Stream;
2423

2524
import javax.cache.CacheManager;
2625
import javax.cache.Caching;
@@ -70,9 +69,9 @@ class JCacheCacheConfiguration implements BeanClassLoaderAware {
7069

7170
private final javax.cache.configuration.Configuration<?, ?> defaultCacheConfiguration;
7271

73-
private final Stream<JCacheManagerCustomizer> cacheManagerCustomizers;
72+
private final ObjectProvider<JCacheManagerCustomizer> cacheManagerCustomizers;
7473

75-
private final Stream<JCachePropertiesCustomizer> cachePropertiesCustomizers;
74+
private final ObjectProvider<JCachePropertiesCustomizer> cachePropertiesCustomizers;
7675

7776
private ClassLoader beanClassLoader;
7877

@@ -84,8 +83,8 @@ class JCacheCacheConfiguration implements BeanClassLoaderAware {
8483
this.cacheProperties = cacheProperties;
8584
this.customizers = customizers;
8685
this.defaultCacheConfiguration = defaultCacheConfiguration.getIfAvailable();
87-
this.cacheManagerCustomizers = cacheManagerCustomizers.orderedStream();
88-
this.cachePropertiesCustomizers = cachePropertiesCustomizers.orderedStream();
86+
this.cacheManagerCustomizers = cacheManagerCustomizers;
87+
this.cachePropertiesCustomizers = cachePropertiesCustomizers;
8988
}
9089

9190
@Override
@@ -135,7 +134,7 @@ private CachingProvider getCachingProvider(String cachingProviderFqn) {
135134

136135
private Properties createCacheManagerProperties() {
137136
Properties properties = new Properties();
138-
this.cachePropertiesCustomizers.forEach(
137+
this.cachePropertiesCustomizers.orderedStream().forEach(
139138
(customizer) -> customizer.customize(this.cacheProperties, properties));
140139
return properties;
141140
}
@@ -148,7 +147,7 @@ private Properties createCacheManagerProperties() {
148147
}
149148

150149
private void customize(CacheManager cacheManager) {
151-
this.cacheManagerCustomizers
150+
this.cacheManagerCustomizers.orderedStream()
152151
.forEach((customizer) -> customizer.customize(cacheManager));
153152
}
154153

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cassandra/CassandraAutoConfiguration.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
package org.springframework.boot.autoconfigure.cassandra;
1818

1919
import java.time.Duration;
20-
import java.util.stream.Stream;
2120

2221
import com.datastax.driver.core.Cluster;
2322
import com.datastax.driver.core.PoolingOptions;
@@ -51,12 +50,12 @@ public class CassandraAutoConfiguration {
5150

5251
private final CassandraProperties properties;
5352

54-
private final Stream<ClusterBuilderCustomizer> builderCustomizers;
53+
private final ObjectProvider<ClusterBuilderCustomizer> builderCustomizers;
5554

5655
public CassandraAutoConfiguration(CassandraProperties properties,
5756
ObjectProvider<ClusterBuilderCustomizer> builderCustomizers) {
5857
this.properties = properties;
59-
this.builderCustomizers = builderCustomizers.orderedStream();
58+
this.builderCustomizers = builderCustomizers;
6059
}
6160

6261
@Bean
@@ -88,7 +87,8 @@ public Cluster cassandraCluster() {
8887
}
8988

9089
private void customize(Cluster.Builder builder) {
91-
this.builderCustomizers.forEach((customizer) -> customizer.customize(builder));
90+
this.builderCustomizers.orderedStream()
91+
.forEach((customizer) -> customizer.customize(builder));
9292
}
9393

9494
private QueryOptions getQueryOptions() {

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/JedisConnectionConfiguration.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818

1919
import java.net.UnknownHostException;
2020
import java.time.Duration;
21-
import java.util.stream.Stream;
2221

2322
import org.apache.commons.pool2.impl.GenericObjectPool;
2423
import redis.clients.jedis.Jedis;
@@ -50,15 +49,15 @@ class JedisConnectionConfiguration extends RedisConnectionConfiguration {
5049

5150
private final RedisProperties properties;
5251

53-
private final Stream<JedisClientConfigurationBuilderCustomizer> builderCustomizers;
52+
private final ObjectProvider<JedisClientConfigurationBuilderCustomizer> builderCustomizers;
5453

5554
JedisConnectionConfiguration(RedisProperties properties,
5655
ObjectProvider<RedisSentinelConfiguration> sentinelConfiguration,
5756
ObjectProvider<RedisClusterConfiguration> clusterConfiguration,
5857
ObjectProvider<JedisClientConfigurationBuilderCustomizer> builderCustomizers) {
5958
super(properties, sentinelConfiguration, clusterConfiguration);
6059
this.properties = properties;
61-
this.builderCustomizers = builderCustomizers.orderedStream();
60+
this.builderCustomizers = builderCustomizers;
6261
}
6362

6463
@Bean
@@ -131,7 +130,8 @@ private void customizeConfigurationFromUrl(
131130

132131
private void customize(
133132
JedisClientConfiguration.JedisClientConfigurationBuilder builder) {
134-
this.builderCustomizers.forEach((customizer) -> customizer.customize(builder));
133+
this.builderCustomizers.orderedStream()
134+
.forEach((customizer) -> customizer.customize(builder));
135135
}
136136

137137
}

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/LettuceConnectionConfiguration.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
package org.springframework.boot.autoconfigure.data.redis;
1818

1919
import java.net.UnknownHostException;
20-
import java.util.stream.Stream;
2120

2221
import io.lettuce.core.RedisClient;
2322
import io.lettuce.core.resource.ClientResources;
@@ -51,15 +50,15 @@ class LettuceConnectionConfiguration extends RedisConnectionConfiguration {
5150

5251
private final RedisProperties properties;
5352

54-
private final Stream<LettuceClientConfigurationBuilderCustomizer> builderCustomizers;
53+
private final ObjectProvider<LettuceClientConfigurationBuilderCustomizer> builderCustomizers;
5554

5655
LettuceConnectionConfiguration(RedisProperties properties,
5756
ObjectProvider<RedisSentinelConfiguration> sentinelConfigurationProvider,
5857
ObjectProvider<RedisClusterConfiguration> clusterConfigurationProvider,
5958
ObjectProvider<LettuceClientConfigurationBuilderCustomizer> builderCustomizers) {
6059
super(properties, sentinelConfigurationProvider, clusterConfigurationProvider);
6160
this.properties = properties;
62-
this.builderCustomizers = builderCustomizers.orderedStream();
61+
this.builderCustomizers = builderCustomizers;
6362
}
6463

6564
@Bean(destroyMethod = "shutdown")
@@ -137,7 +136,8 @@ private void customizeConfigurationFromUrl(
137136

138137
private void customize(
139138
LettuceClientConfiguration.LettuceClientConfigurationBuilder builder) {
140-
this.builderCustomizers.forEach((customizer) -> customizer.customize(builder));
139+
this.builderCustomizers.orderedStream()
140+
.forEach((customizer) -> customizer.customize(builder));
141141
}
142142

143143
/**

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/elasticsearch/jest/JestAutoConfiguration.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
package org.springframework.boot.autoconfigure.elasticsearch.jest;
1818

1919
import java.time.Duration;
20-
import java.util.stream.Stream;
2120

2221
import com.google.gson.Gson;
2322
import io.searchbox.client.JestClient;
@@ -54,13 +53,13 @@ public class JestAutoConfiguration {
5453

5554
private final ObjectProvider<Gson> gsonProvider;
5655

57-
private final Stream<HttpClientConfigBuilderCustomizer> builderCustomizers;
56+
private final ObjectProvider<HttpClientConfigBuilderCustomizer> builderCustomizers;
5857

5958
public JestAutoConfiguration(JestProperties properties, ObjectProvider<Gson> gson,
6059
ObjectProvider<HttpClientConfigBuilderCustomizer> builderCustomizers) {
6160
this.properties = properties;
6261
this.gsonProvider = gson;
63-
this.builderCustomizers = builderCustomizers.orderedStream();
62+
this.builderCustomizers = builderCustomizers;
6463
}
6564

6665
@Bean(destroyMethod = "shutdownClient")
@@ -93,7 +92,8 @@ protected HttpClientConfig createHttpClientConfig() {
9392
}
9493

9594
private void customize(HttpClientConfig.Builder builder) {
96-
this.builderCustomizers.forEach((customizer) -> customizer.customize(builder));
95+
this.builderCustomizers.orderedStream()
96+
.forEach((customizer) -> customizer.customize(builder));
9797
}
9898

9999
}

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/elasticsearch/rest/RestClientAutoConfiguration.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,6 @@
1616

1717
package org.springframework.boot.autoconfigure.elasticsearch.rest;
1818

19-
import java.util.stream.Stream;
20-
2119
import org.apache.http.HttpHost;
2220
import org.apache.http.auth.AuthScope;
2321
import org.apache.http.auth.Credentials;
@@ -50,12 +48,12 @@ public class RestClientAutoConfiguration {
5048

5149
private final RestClientProperties properties;
5250

53-
private final Stream<RestClientBuilderCustomizer> builderCustomizers;
51+
private final ObjectProvider<RestClientBuilderCustomizer> builderCustomizers;
5452

5553
public RestClientAutoConfiguration(RestClientProperties properties,
5654
ObjectProvider<RestClientBuilderCustomizer> builderCustomizers) {
5755
this.properties = properties;
58-
this.builderCustomizers = builderCustomizers.orderedStream();
56+
this.builderCustomizers = builderCustomizers;
5957
}
6058

6159
@Bean
@@ -79,7 +77,8 @@ public RestClientBuilder restClientBuilder() {
7977
builder.setHttpClientConfigCallback((httpClientBuilder) -> httpClientBuilder
8078
.setDefaultCredentialsProvider(credentialsProvider));
8179
});
82-
this.builderCustomizers.forEach((customizer) -> customizer.customize(builder));
80+
this.builderCustomizers.orderedStream()
81+
.forEach((customizer) -> customizer.customize(builder));
8382
return builder;
8483
}
8584

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jersey/JerseyAutoConfiguration.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818

1919
import java.util.Arrays;
2020
import java.util.EnumSet;
21-
import java.util.stream.Stream;
2221

2322
import javax.annotation.PostConstruct;
2423
import javax.servlet.DispatcherType;
@@ -93,15 +92,15 @@ public class JerseyAutoConfiguration implements ServletContextAware {
9392

9493
private final ResourceConfig config;
9594

96-
private final Stream<ResourceConfigCustomizer> customizers;
95+
private final ObjectProvider<ResourceConfigCustomizer> customizers;
9796

9897
private String path;
9998

10099
public JerseyAutoConfiguration(JerseyProperties jersey, ResourceConfig config,
101100
ObjectProvider<ResourceConfigCustomizer> customizers) {
102101
this.jersey = jersey;
103102
this.config = config;
104-
this.customizers = customizers.orderedStream();
103+
this.customizers = customizers;
105104
}
106105

107106
@PostConstruct
@@ -121,7 +120,8 @@ private void resolveApplicationPath() {
121120
}
122121

123122
private void customize() {
124-
this.customizers.forEach((customizer) -> customizer.customize(this.config));
123+
this.customizers.orderedStream()
124+
.forEach((customizer) -> customizer.customize(this.config));
125125
}
126126

127127
@Bean

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jms/artemis/ArtemisEmbeddedServerConfiguration.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
import java.util.Collection;
2020
import java.util.List;
2121
import java.util.stream.Collectors;
22-
import java.util.stream.Stream;
2322

2423
import org.apache.activemq.artemis.jms.server.config.JMSConfiguration;
2524
import org.apache.activemq.artemis.jms.server.config.JMSQueueConfiguration;
@@ -50,7 +49,7 @@ class ArtemisEmbeddedServerConfiguration {
5049

5150
private final ArtemisProperties properties;
5251

53-
private final Stream<ArtemisConfigurationCustomizer> configurationCustomizers;
52+
private final ObjectProvider<ArtemisConfigurationCustomizer> configurationCustomizers;
5453

5554
private final List<JMSQueueConfiguration> queuesConfiguration;
5655

@@ -61,7 +60,7 @@ class ArtemisEmbeddedServerConfiguration {
6160
ObjectProvider<JMSQueueConfiguration> queuesConfiguration,
6261
ObjectProvider<TopicConfiguration> topicsConfiguration) {
6362
this.properties = properties;
64-
this.configurationCustomizers = configurationCustomizers.orderedStream();
63+
this.configurationCustomizers = configurationCustomizers;
6564
this.queuesConfiguration = queuesConfiguration.orderedStream()
6665
.collect(Collectors.toList());
6766
this.topicsConfiguration = topicsConfiguration.orderedStream()
@@ -90,7 +89,7 @@ public EmbeddedJMS artemisServer(
9089

9190
private void customize(
9291
org.apache.activemq.artemis.core.config.Configuration configuration) {
93-
this.configurationCustomizers
92+
this.configurationCustomizers.orderedStream()
9493
.forEach((customizer) -> customizer.customize(configuration));
9594
}
9695

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/quartz/QuartzAutoConfiguration.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818

1919
import java.util.Map;
2020
import java.util.Properties;
21-
import java.util.stream.Stream;
2221

2322
import javax.sql.DataSource;
2423

@@ -61,7 +60,7 @@ public class QuartzAutoConfiguration {
6160

6261
private final QuartzProperties properties;
6362

64-
private final Stream<SchedulerFactoryBeanCustomizer> customizers;
63+
private final ObjectProvider<SchedulerFactoryBeanCustomizer> customizers;
6564

6665
private final JobDetail[] jobDetails;
6766

@@ -77,7 +76,7 @@ public QuartzAutoConfiguration(QuartzProperties properties,
7776
ObjectProvider<Map<String, Calendar>> calendars,
7877
ObjectProvider<Trigger[]> triggers, ApplicationContext applicationContext) {
7978
this.properties = properties;
80-
this.customizers = customizers.orderedStream();
79+
this.customizers = customizers;
8180
this.jobDetails = jobDetails.getIfAvailable();
8281
this.calendars = calendars.getIfAvailable();
8382
this.triggers = triggers.getIfAvailable();
@@ -124,7 +123,7 @@ private Properties asProperties(Map<String, String> source) {
124123
}
125124

126125
private void customize(SchedulerFactoryBean schedulerFactoryBean) {
127-
this.customizers
126+
this.customizers.orderedStream()
128127
.forEach((customizer) -> customizer.customize(schedulerFactoryBean));
129128
}
130129

0 commit comments

Comments
 (0)