为了自定义LettuceConnectionFactory
,我创建了两个函数,它们具有相同的返回类型和不同的参数,一个是单节点配置,另一个是集群配置。代码如下:
@Component
@Configuration
public class RedisConfig {
@Bean(name = "singleFactory")
public LettuceConnectionFactory createSingleFactory(RedisSingleConfig redisSingleConfig){...}
@Bean(name = "clusterFactory")
public LettuceConnectionFactory createClusterFactory(RedisClusterConfig redisClusterConfig){...}
}
调用它们时,返回值(LettuceConnectionFactory)是另一个函数的参数。代码如下:
@Autowired
private RedisActivityClusterConfig testConfig;
@Autowired
private RedisItemConfig redisItemConfig;
@Autowired
private RedisConfig redisConfig;
@Autowired
private StringRedisTemplate redisTemplate;
@Test
public void test(){
redisTemplate.setConnectionFactory(redisConfig.createClusterFactory(testConfig));
ValueOperations<String, String> valueOperations = redisTemplate.opsForValue();
System.out.println(valueOperations.get("test"));
}
但顺便说一下,春季将报告
No qualifying bean of type 'org.springframework.data.redis.connection.RedisConnectionFactory' available: expected single matching bean but found 2: singleFactory,clusterFactory
问题补充:
由于项目稍微复杂一些,因此有很多Redis单个服务器A,B,C ...和群集服务器A,B,C ...,它们具有不同的ip,端口和池策略。我的原始想法是,通过将不同的redisConfig作为参数(例如RedisConfig_A,RedisConfig_B,RedisConfig_C(可通过参考资料中的redis.properties获取)来注入参数)来动态生成不同的LettuceConnectionFactories,然后使用这些LettuceConnectionFactories创建自定义的RedisTemplates。我的困惑是,这些objs:RedisConfig,LettuceConnectionFactories是否可以自动连线?我已经尝试了很多方法,但是没有用...
最佳答案
您需要创建自己的自定义RedisTemplate
,否则默认值将尝试自动连接默认值RedisConnectionFactory
,从而导致您的错误。
@Component
@Configuration
public class RedisConfig {
@Bean(name = "redisTemplateA")
public RedisTemplate<String, Object> redisTemplateA(RedisClusterConfig redisClusterConfigA) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(createClusterFactoryA(redisClusterConfigA));
return template;
}
@Primary
@Bean(name = "singleFactoryA")
public LettuceConnectionFactory createSingleFactoryA(RedisSingleConfig redisSingleConfigA){...}
@Bean(name = "clusterFactoryA")
public LettuceConnectionFactory createClusterFactoryA(RedisClusterConfig redisClusterConfigA){...}
// other combinations as needed
}
然后在测试中使用此
RedisTemplate
。更多详细信息/示例here另外,您不能进行动态配置传递,因为如上一个问题所述,必须将
LettuceConnectionFactory
作为bean,而不是进行基本初始化。因此,您需要为每个配置定义LettuceConnectionFactories
的所有组合,例如singleFactoryA
(使用configA
),clusterFactoryB
(使用configB
),然后仅使用所需的config + factory组合创建多个RedisTemplate
。始终使用不同的bean名称,这应该可以工作。如果需要所有组合,则可以将所有这些
RedisTemplate
存储到某些Table
中,其中键将是配置类型(A
,B
,C
)和工厂类型(single
,cluster
),其值本身就是模板。 Table<ConfigType, FactoryType, RedisTemplate> redisTemplateTable
,我只是假定ConfigType
和FactoryType
作为您的自定义枚举类关于java - 关于具有与其他函数相同类型和不同参数的 Spring bean 的困惑,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53130086/