Skip to content

Commit d4980ea

Browse files
committed
Always define connection details beans
Closes gh-34776
1 parent 466b81f commit d4980ea

File tree

56 files changed

+1007
-314
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

56 files changed

+1007
-314
lines changed

spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/tracing/zipkin/ZipkinAutoConfiguration.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2012-2022 the original author or authors.
2+
* Copyright 2012-2023 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.
@@ -50,6 +50,12 @@
5050
@ConditionalOnEnabledTracing
5151
public class ZipkinAutoConfiguration {
5252

53+
@Bean
54+
@ConditionalOnMissingBean(ZipkinConnectionDetails.class)
55+
PropertiesZipkinConnectionDetails zipkinConnectionDetails(ZipkinProperties properties) {
56+
return new PropertiesZipkinConnectionDetails(properties);
57+
}
58+
5359
@Bean
5460
@ConditionalOnMissingBean
5561
public BytesEncoder<Span> spanBytesEncoder() {

spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/tracing/zipkin/ZipkinAutoConfigurationTests.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,25 @@ void shouldNotSupplyBeansIfTracingIsDisabled() {
6464
.run((context) -> assertThat(context).doesNotHaveBean(BytesEncoder.class));
6565
}
6666

67+
@Test
68+
void definesPropertiesBasedConnectionDetailsByDefault() {
69+
this.contextRunner.run((context) -> assertThat(context).hasSingleBean(PropertiesZipkinConnectionDetails.class));
70+
}
71+
72+
@Test
73+
void shouldUseCustomConnectionDetailsWhenDefined() {
74+
this.contextRunner.withBean(ZipkinConnectionDetails.class, () -> new ZipkinConnectionDetails() {
75+
76+
@Override
77+
public String getSpanEndpoint() {
78+
return "http://localhost";
79+
}
80+
81+
})
82+
.run((context) -> assertThat(context).hasSingleBean(ZipkinConnectionDetails.class)
83+
.doesNotHaveBean(PropertiesZipkinConnectionDetails.class));
84+
}
85+
6786
@Configuration(proxyBeanMethods = false)
6887
private static class CustomConfiguration {
6988

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/amqp/PropertiesRabbitConnectionDetails.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,12 @@
2525
* @author Moritz Halbritter
2626
* @author Andy Wilkinson
2727
* @author Phillip Webb
28-
* @since 3.1.0
2928
*/
30-
public class PropertiesRabbitConnectionDetails implements RabbitConnectionDetails {
29+
class PropertiesRabbitConnectionDetails implements RabbitConnectionDetails {
3130

3231
private final RabbitProperties properties;
3332

34-
public PropertiesRabbitConnectionDetails(RabbitProperties properties) {
33+
PropertiesRabbitConnectionDetails(RabbitProperties properties) {
3534
this.properties = properties;
3635
}
3736

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/amqp/RabbitAutoConfiguration.java

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -82,33 +82,35 @@ protected static class RabbitConnectionFactoryCreator {
8282

8383
private final RabbitProperties properties;
8484

85-
private final RabbitConnectionDetails connectionDetails;
86-
8785
protected RabbitConnectionFactoryCreator(RabbitProperties properties,
8886
ObjectProvider<RabbitConnectionDetails> connectionDetails) {
8987
this.properties = properties;
90-
this.connectionDetails = connectionDetails
91-
.getIfAvailable(() -> new PropertiesRabbitConnectionDetails(properties));
88+
}
89+
90+
@Bean
91+
@ConditionalOnMissingBean(RabbitConnectionDetails.class)
92+
RabbitConnectionDetails rabbitConnectionDetails() {
93+
return new PropertiesRabbitConnectionDetails(this.properties);
9294
}
9395

9496
@Bean
9597
@ConditionalOnMissingBean
9698
RabbitConnectionFactoryBeanConfigurer rabbitConnectionFactoryBeanConfigurer(ResourceLoader resourceLoader,
97-
ObjectProvider<CredentialsProvider> credentialsProvider,
99+
RabbitConnectionDetails connectionDetails, ObjectProvider<CredentialsProvider> credentialsProvider,
98100
ObjectProvider<CredentialsRefreshService> credentialsRefreshService) {
99101
RabbitConnectionFactoryBeanConfigurer configurer = new RabbitConnectionFactoryBeanConfigurer(resourceLoader,
100-
this.properties, this.connectionDetails);
102+
this.properties, connectionDetails);
101103
configurer.setCredentialsProvider(credentialsProvider.getIfUnique());
102104
configurer.setCredentialsRefreshService(credentialsRefreshService.getIfUnique());
103105
return configurer;
104106
}
105107

106108
@Bean
107109
@ConditionalOnMissingBean
108-
CachingConnectionFactoryConfigurer rabbitConnectionFactoryConfigurer(
110+
CachingConnectionFactoryConfigurer rabbitConnectionFactoryConfigurer(RabbitConnectionDetails connectionDetails,
109111
ObjectProvider<ConnectionNameStrategy> connectionNameStrategy) {
110112
CachingConnectionFactoryConfigurer configurer = new CachingConnectionFactoryConfigurer(this.properties,
111-
this.connectionDetails);
113+
connectionDetails);
112114
configurer.setConnectionNameStrategy(connectionNameStrategy.getIfUnique());
113115
return configurer;
114116
}

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

Lines changed: 27 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -84,13 +84,14 @@ public class CassandraAutoConfiguration {
8484

8585
private final CassandraProperties properties;
8686

87-
private final CassandraConnectionDetails connectionDetails;
88-
89-
CassandraAutoConfiguration(CassandraProperties properties,
90-
ObjectProvider<CassandraConnectionDetails> connectionDetails) {
87+
CassandraAutoConfiguration(CassandraProperties properties) {
9188
this.properties = properties;
92-
this.connectionDetails = connectionDetails
93-
.getIfAvailable(() -> new PropertiesCassandraConnectionDetails(properties));
89+
}
90+
91+
@Bean
92+
@ConditionalOnMissingBean(CassandraConnectionDetails.class)
93+
PropertiesCassandraConnectionDetails cassandraConnectionDetails() {
94+
return new PropertiesCassandraConnectionDetails(this.properties);
9495
}
9596

9697
@Bean
@@ -104,24 +105,25 @@ public CqlSession cassandraSession(CqlSessionBuilder cqlSessionBuilder) {
104105
@ConditionalOnMissingBean
105106
@Scope("prototype")
106107
public CqlSessionBuilder cassandraSessionBuilder(DriverConfigLoader driverConfigLoader,
108+
CassandraConnectionDetails connectionDetails,
107109
ObjectProvider<CqlSessionBuilderCustomizer> builderCustomizers) {
108110
CqlSessionBuilder builder = CqlSession.builder().withConfigLoader(driverConfigLoader);
109-
configureAuthentication(builder);
110-
configureSsl(builder);
111+
configureAuthentication(builder, connectionDetails);
112+
configureSsl(builder, connectionDetails);
111113
builder.withKeyspace(this.properties.getKeyspaceName());
112114
builderCustomizers.orderedStream().forEach((customizer) -> customizer.customize(builder));
113115
return builder;
114116
}
115117

116-
private void configureAuthentication(CqlSessionBuilder builder) {
117-
String username = this.connectionDetails.getUsername();
118+
private void configureAuthentication(CqlSessionBuilder builder, CassandraConnectionDetails connectionDetails) {
119+
String username = connectionDetails.getUsername();
118120
if (username != null) {
119-
builder.withAuthCredentials(username, this.connectionDetails.getPassword());
121+
builder.withAuthCredentials(username, connectionDetails.getPassword());
120122
}
121123
}
122124

123-
private void configureSsl(CqlSessionBuilder builder) {
124-
if (this.connectionDetails instanceof PropertiesCassandraConnectionDetails && this.properties.isSsl()) {
125+
private void configureSsl(CqlSessionBuilder builder, CassandraConnectionDetails connectionDetails) {
126+
if (connectionDetails instanceof PropertiesCassandraConnectionDetails && this.properties.isSsl()) {
125127
try {
126128
builder.withSslContext(SSLContext.getDefault());
127129
}
@@ -133,18 +135,18 @@ private void configureSsl(CqlSessionBuilder builder) {
133135

134136
@Bean(destroyMethod = "")
135137
@ConditionalOnMissingBean
136-
public DriverConfigLoader cassandraDriverConfigLoader(
138+
public DriverConfigLoader cassandraDriverConfigLoader(CassandraConnectionDetails connectionDetails,
137139
ObjectProvider<DriverConfigLoaderBuilderCustomizer> builderCustomizers) {
138140
ProgrammaticDriverConfigLoaderBuilder builder = new DefaultProgrammaticDriverConfigLoaderBuilder(
139-
() -> cassandraConfiguration(), DefaultDriverConfigLoader.DEFAULT_ROOT_PATH);
141+
() -> cassandraConfiguration(connectionDetails), DefaultDriverConfigLoader.DEFAULT_ROOT_PATH);
140142
builderCustomizers.orderedStream().forEach((customizer) -> customizer.customize(builder));
141143
return builder.build();
142144
}
143145

144-
private Config cassandraConfiguration() {
146+
private Config cassandraConfiguration(CassandraConnectionDetails connectionDetails) {
145147
ConfigFactory.invalidateCaches();
146148
Config config = ConfigFactory.defaultOverrides();
147-
config = config.withFallback(mapConfig());
149+
config = config.withFallback(mapConfig(connectionDetails));
148150
if (this.properties.getConfig() != null) {
149151
config = config.withFallback(loadConfig(this.properties.getConfig()));
150152
}
@@ -162,24 +164,24 @@ private Config loadConfig(Resource resource) {
162164
}
163165
}
164166

165-
private Config mapConfig() {
167+
private Config mapConfig(CassandraConnectionDetails connectionDetails) {
166168
CassandraDriverOptions options = new CassandraDriverOptions();
167169
PropertyMapper map = PropertyMapper.get().alwaysApplyingWhenNonNull();
168170
map.from(this.properties.getSessionName())
169171
.whenHasText()
170172
.to((sessionName) -> options.add(DefaultDriverOption.SESSION_NAME, sessionName));
171-
map.from(this.connectionDetails.getUsername())
173+
map.from(connectionDetails.getUsername())
172174
.to((value) -> options.add(DefaultDriverOption.AUTH_PROVIDER_USER_NAME, value)
173-
.add(DefaultDriverOption.AUTH_PROVIDER_PASSWORD, this.connectionDetails.getPassword()));
175+
.add(DefaultDriverOption.AUTH_PROVIDER_PASSWORD, connectionDetails.getPassword()));
174176
map.from(this.properties::getCompression)
175177
.to((compression) -> options.add(DefaultDriverOption.PROTOCOL_COMPRESSION, compression));
176178
mapConnectionOptions(options);
177179
mapPoolingOptions(options);
178180
mapRequestOptions(options);
179181
mapControlConnectionOptions(options);
180-
map.from(mapContactPoints())
182+
map.from(mapContactPoints(connectionDetails))
181183
.to((contactPoints) -> options.add(DefaultDriverOption.CONTACT_POINTS, contactPoints));
182-
map.from(this.connectionDetails.getLocalDatacenter())
184+
map.from(connectionDetails.getLocalDatacenter())
183185
.whenHasText()
184186
.to((localDatacenter) -> options.add(DefaultDriverOption.LOAD_BALANCING_LOCAL_DATACENTER, localDatacenter));
185187
return options.build();
@@ -244,11 +246,8 @@ private void mapControlConnectionOptions(CassandraDriverOptions options) {
244246
.to((timeout) -> options.add(DefaultDriverOption.CONTROL_CONNECTION_TIMEOUT, timeout));
245247
}
246248

247-
private List<String> mapContactPoints() {
248-
return this.connectionDetails.getContactPoints()
249-
.stream()
250-
.map((node) -> node.host() + ":" + node.port())
251-
.toList();
249+
private List<String> mapContactPoints(CassandraConnectionDetails connectionDetails) {
250+
return connectionDetails.getContactPoints().stream().map((node) -> node.host() + ":" + node.port()).toList();
252251
}
253252

254253
private static class CassandraDriverOptions {
@@ -289,7 +288,7 @@ private static String createKeyFor(DriverOption option) {
289288
/**
290289
* Adapts {@link CassandraProperties} to {@link CassandraConnectionDetails}.
291290
*/
292-
private static final class PropertiesCassandraConnectionDetails implements CassandraConnectionDetails {
291+
static final class PropertiesCassandraConnectionDetails implements CassandraConnectionDetails {
293292

294293
private final CassandraProperties properties;
295294

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/couchbase/CouchbaseAutoConfiguration.java

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -69,34 +69,37 @@ public class CouchbaseAutoConfiguration {
6969

7070
private final CouchbaseProperties properties;
7171

72-
private final CouchbaseConnectionDetails connectionDetails;
73-
7472
CouchbaseAutoConfiguration(CouchbaseProperties properties,
7573
ObjectProvider<CouchbaseConnectionDetails> connectionDetails) {
7674
this.properties = properties;
77-
this.connectionDetails = connectionDetails
78-
.getIfAvailable(() -> new PropertiesCouchbaseConnectionDetails(properties));
75+
}
76+
77+
@Bean
78+
@ConditionalOnMissingBean(CouchbaseConnectionDetails.class)
79+
PropertiesCouchbaseConnectionDetails couchbaseConnectionDetails() {
80+
return new PropertiesCouchbaseConnectionDetails(this.properties);
7981
}
8082

8183
@Bean
8284
@ConditionalOnMissingBean
83-
public ClusterEnvironment couchbaseClusterEnvironment(
85+
public ClusterEnvironment couchbaseClusterEnvironment(CouchbaseConnectionDetails connectionDetails,
8486
ObjectProvider<ClusterEnvironmentBuilderCustomizer> customizers) {
85-
Builder builder = initializeEnvironmentBuilder();
87+
Builder builder = initializeEnvironmentBuilder(connectionDetails);
8688
customizers.orderedStream().forEach((customizer) -> customizer.customize(builder));
8789
return builder.build();
8890
}
8991

9092
@Bean(destroyMethod = "disconnect")
9193
@ConditionalOnMissingBean
92-
public Cluster couchbaseCluster(ClusterEnvironment couchbaseClusterEnvironment) {
94+
public Cluster couchbaseCluster(ClusterEnvironment couchbaseClusterEnvironment,
95+
CouchbaseConnectionDetails connectionDetails) {
9396
ClusterOptions options = ClusterOptions
94-
.clusterOptions(this.connectionDetails.getUsername(), this.connectionDetails.getPassword())
97+
.clusterOptions(connectionDetails.getUsername(), connectionDetails.getPassword())
9598
.environment(couchbaseClusterEnvironment);
96-
return Cluster.connect(this.connectionDetails.getConnectionString(), options);
99+
return Cluster.connect(connectionDetails.getConnectionString(), options);
97100
}
98101

99-
private ClusterEnvironment.Builder initializeEnvironmentBuilder() {
102+
private ClusterEnvironment.Builder initializeEnvironmentBuilder(CouchbaseConnectionDetails connectionDetails) {
100103
ClusterEnvironment.Builder builder = ClusterEnvironment.builder();
101104
Timeouts timeouts = this.properties.getEnv().getTimeouts();
102105
builder.timeoutConfig((config) -> config.kvTimeout(timeouts.getKeyValue())
@@ -112,7 +115,7 @@ private ClusterEnvironment.Builder initializeEnvironmentBuilder() {
112115
builder.ioConfig((config) -> config.maxHttpConnections(io.getMaxEndpoints())
113116
.numKvConnections(io.getMinEndpoints())
114117
.idleHttpConnectionTimeout(io.getIdleHttpConnectionTimeout()));
115-
if ((this.connectionDetails instanceof PropertiesCouchbaseConnectionDetails)
118+
if ((connectionDetails instanceof PropertiesCouchbaseConnectionDetails)
116119
&& this.properties.getEnv().getSsl().getEnabled()) {
117120
builder.securityConfig((config) -> config.enableTls(true)
118121
.trustManagerFactory(getTrustManagerFactory(this.properties.getEnv().getSsl())));

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/mongo/MongoDataAutoConfiguration.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2012-2022 the original author or authors.
2+
* Copyright 2012-2023 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.
@@ -21,9 +21,13 @@
2121
import org.springframework.boot.autoconfigure.AutoConfiguration;
2222
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
2323
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
24+
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
2425
import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration;
26+
import org.springframework.boot.autoconfigure.mongo.MongoConnectionDetails;
2527
import org.springframework.boot.autoconfigure.mongo.MongoProperties;
28+
import org.springframework.boot.autoconfigure.mongo.PropertiesMongoConnectionDetails;
2629
import org.springframework.boot.context.properties.EnableConfigurationProperties;
30+
import org.springframework.context.annotation.Bean;
2731
import org.springframework.context.annotation.Import;
2832
import org.springframework.data.mongodb.core.MongoTemplate;
2933
import org.springframework.data.mongodb.gridfs.GridFsTemplate;
@@ -53,4 +57,10 @@
5357
MongoDatabaseFactoryDependentConfiguration.class })
5458
public class MongoDataAutoConfiguration {
5559

60+
@Bean
61+
@ConditionalOnMissingBean(MongoConnectionDetails.class)
62+
PropertiesMongoConnectionDetails mongoConnectionDetails(MongoProperties properties) {
63+
return new PropertiesMongoConnectionDetails(properties);
64+
}
65+
5666
}

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/mongo/MongoDatabaseFactoryConfiguration.java

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,10 @@
1818

1919
import com.mongodb.client.MongoClient;
2020

21-
import org.springframework.beans.factory.ObjectProvider;
2221
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
2322
import org.springframework.boot.autoconfigure.condition.ConditionalOnSingleCandidate;
2423
import org.springframework.boot.autoconfigure.mongo.MongoConnectionDetails;
2524
import org.springframework.boot.autoconfigure.mongo.MongoProperties;
26-
import org.springframework.boot.autoconfigure.mongo.PropertiesMongoConnectionDetails;
2725
import org.springframework.context.annotation.Bean;
2826
import org.springframework.context.annotation.Configuration;
2927
import org.springframework.data.mongodb.MongoDatabaseFactory;
@@ -45,11 +43,8 @@ class MongoDatabaseFactoryConfiguration {
4543

4644
@Bean
4745
MongoDatabaseFactorySupport<?> mongoDatabaseFactory(MongoClient mongoClient, MongoProperties properties,
48-
ObjectProvider<MongoConnectionDetails> connectionDetails) {
49-
return new SimpleMongoClientDatabaseFactory(mongoClient,
50-
connectionDetails.getIfAvailable(() -> new PropertiesMongoConnectionDetails(properties))
51-
.getConnectionString()
52-
.getDatabase());
46+
MongoConnectionDetails connectionDetails) {
47+
return new SimpleMongoClientDatabaseFactory(mongoClient, connectionDetails.getConnectionString().getDatabase());
5348
}
5449

5550
}

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/mongo/MongoDatabaseFactoryDependentConfiguration.java

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,12 @@
2020
import com.mongodb.client.ClientSession;
2121
import com.mongodb.client.MongoDatabase;
2222

23-
import org.springframework.beans.factory.ObjectProvider;
2423
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
2524
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
2625
import org.springframework.boot.autoconfigure.mongo.MongoConnectionDetails;
2726
import org.springframework.boot.autoconfigure.mongo.MongoConnectionDetails.GridFs;
2827
import org.springframework.boot.autoconfigure.mongo.MongoProperties;
2928
import org.springframework.boot.autoconfigure.mongo.MongoProperties.Gridfs;
30-
import org.springframework.boot.autoconfigure.mongo.PropertiesMongoConnectionDetails;
3129
import org.springframework.context.annotation.Bean;
3230
import org.springframework.context.annotation.Configuration;
3331
import org.springframework.dao.DataAccessException;
@@ -76,9 +74,7 @@ MappingMongoConverter mappingMongoConverter(MongoDatabaseFactory factory, MongoM
7674
@Bean
7775
@ConditionalOnMissingBean(GridFsOperations.class)
7876
GridFsTemplate gridFsTemplate(MongoProperties properties, MongoDatabaseFactory factory, MongoTemplate mongoTemplate,
79-
ObjectProvider<MongoConnectionDetails> connectionDetailsProvider) {
80-
MongoConnectionDetails connectionDetails = connectionDetailsProvider
81-
.getIfAvailable(() -> new PropertiesMongoConnectionDetails(properties));
77+
MongoConnectionDetails connectionDetails) {
8278
return new GridFsTemplate(new GridFsMongoDatabaseFactory(factory, connectionDetails),
8379
mongoTemplate.getConverter(),
8480
(connectionDetails.getGridFs() != null) ? connectionDetails.getGridFs().getBucket() : null);

0 commit comments

Comments
 (0)