From 236c2dd0dab99e9f5cba4774726f1e5f5822cbd5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Wed, 15 Sep 2021 20:59:18 -0500 Subject: [PATCH] Add support for used-defined RedisStandaloneConfiguration See gh-28028 --- .../redis/JedisConnectionConfiguration.java | 5 ++++- .../redis/LettuceConnectionConfiguration.java | 5 ++++- .../redis/RedisConnectionConfiguration.java | 8 +++++++ .../redis/RedisAutoConfigurationTests.java | 21 +++++++++++++++++++ 4 files changed, 37 insertions(+), 2 deletions(-) diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/JedisConnectionConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/JedisConnectionConfiguration.java index 86ec6d18d6..32bf69717d 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/JedisConnectionConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/JedisConnectionConfiguration.java @@ -30,6 +30,7 @@ import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisClusterConfiguration; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.connection.RedisSentinelConfiguration; +import org.springframework.data.redis.connection.RedisStandaloneConfiguration; import org.springframework.data.redis.connection.jedis.JedisClientConfiguration; import org.springframework.data.redis.connection.jedis.JedisClientConfiguration.JedisClientConfigurationBuilder; import org.springframework.data.redis.connection.jedis.JedisConnection; @@ -41,6 +42,7 @@ import org.springframework.util.StringUtils; * * @author Mark Paluch * @author Stephane Nicoll + * @author Eddú Meléndez */ @Configuration(proxyBeanMethods = false) @ConditionalOnClass({ GenericObjectPool.class, JedisConnection.class, Jedis.class }) @@ -49,9 +51,10 @@ import org.springframework.util.StringUtils; class JedisConnectionConfiguration extends RedisConnectionConfiguration { JedisConnectionConfiguration(RedisProperties properties, + ObjectProvider standaloneConfigurationProvider, ObjectProvider sentinelConfiguration, ObjectProvider clusterConfiguration) { - super(properties, sentinelConfiguration, clusterConfiguration); + super(properties, standaloneConfigurationProvider, sentinelConfiguration, clusterConfiguration); } @Bean diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/LettuceConnectionConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/LettuceConnectionConfiguration.java index a84055432e..9067a15556 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/LettuceConnectionConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/LettuceConnectionConfiguration.java @@ -40,6 +40,7 @@ import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisClusterConfiguration; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.connection.RedisSentinelConfiguration; +import org.springframework.data.redis.connection.RedisStandaloneConfiguration; import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration; import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration.LettuceClientConfigurationBuilder; import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; @@ -51,6 +52,7 @@ import org.springframework.util.StringUtils; * * @author Mark Paluch * @author Andy Wilkinson + * @author Eddú Meléndez */ @Configuration(proxyBeanMethods = false) @ConditionalOnClass(RedisClient.class) @@ -58,9 +60,10 @@ import org.springframework.util.StringUtils; class LettuceConnectionConfiguration extends RedisConnectionConfiguration { LettuceConnectionConfiguration(RedisProperties properties, + ObjectProvider standaloneConfigurationProvider, ObjectProvider sentinelConfigurationProvider, ObjectProvider clusterConfigurationProvider) { - super(properties, sentinelConfigurationProvider, clusterConfigurationProvider); + super(properties, standaloneConfigurationProvider, sentinelConfigurationProvider, clusterConfigurationProvider); } @Bean(destroyMethod = "shutdown") diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/RedisConnectionConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/RedisConnectionConfiguration.java index 4940843b8a..b870e4a550 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/RedisConnectionConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/RedisConnectionConfiguration.java @@ -39,6 +39,7 @@ import org.springframework.util.StringUtils; * @author Stephane Nicoll * @author Alen Turkovic * @author Scott Frederick + * @author Eddú Meléndez */ abstract class RedisConnectionConfiguration { @@ -47,19 +48,26 @@ abstract class RedisConnectionConfiguration { private final RedisProperties properties; + private final RedisStandaloneConfiguration standaloneConfiguration; + private final RedisSentinelConfiguration sentinelConfiguration; private final RedisClusterConfiguration clusterConfiguration; protected RedisConnectionConfiguration(RedisProperties properties, + ObjectProvider standaloneConfigurationProvider, ObjectProvider sentinelConfigurationProvider, ObjectProvider clusterConfigurationProvider) { this.properties = properties; + this.standaloneConfiguration = standaloneConfigurationProvider.getIfAvailable(); this.sentinelConfiguration = sentinelConfigurationProvider.getIfAvailable(); this.clusterConfiguration = clusterConfigurationProvider.getIfAvailable(); } protected final RedisStandaloneConfiguration getStandaloneConfig() { + if (this.standaloneConfiguration != null) { + return this.standaloneConfiguration; + } RedisStandaloneConfiguration config = new RedisStandaloneConfiguration(); if (StringUtils.hasText(this.properties.getUrl())) { ConnectionInfo connectionInfo = parseUrl(this.properties.getUrl()); diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/redis/RedisAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/redis/RedisAutoConfigurationTests.java index 0247c322c3..cbc0855035 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/redis/RedisAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/redis/RedisAutoConfigurationTests.java @@ -44,6 +44,7 @@ import org.springframework.data.redis.connection.RedisClusterConfiguration; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.connection.RedisNode; import org.springframework.data.redis.connection.RedisSentinelConfiguration; +import org.springframework.data.redis.connection.RedisStandaloneConfiguration; import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration; import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration.LettuceClientConfigurationBuilder; @@ -235,6 +236,14 @@ class RedisAutoConfigurationTests { }); } + @Test + void testRedisConfigurationWithCustomBean() { + this.contextRunner.withUserConfiguration(RedisStandaloneConfig.class).run((context) -> { + LettuceConnectionFactory cf = context.getBean(LettuceConnectionFactory.class); + assertThat(cf.getHostName()).isEqualTo("foo"); + }); + } + @Test void testRedisConfigurationWithClientName() { this.contextRunner.withPropertyValues("spring.redis.host:foo", "spring.redis.client-name:spring-boot") @@ -456,4 +465,16 @@ class RedisAutoConfigurationTests { } + @Configuration(proxyBeanMethods = false) + static class RedisStandaloneConfig { + + @Bean + RedisStandaloneConfiguration standaloneConfiguration() { + RedisStandaloneConfiguration config = new RedisStandaloneConfiguration(); + config.setHostName("foo"); + return config; + } + + } + }