Spring Boot应用程序中的多个RedisConnectionFactorys

Spring Boot应用程序中的多个RedisConnectionFactorys,spring,spring-boot,spring-java-config,spring-data-redis,Spring,Spring Boot,Spring Java Config,Spring Data Redis,我的应用程序使用一个“主”redis实例进行会话存储和缓存,但出于其他原因,需要与一个单独的“外部”实例通信。我正试图确定在Spring Boot应用程序中配置此功能的“最佳”(“最惯用的”?“最简单”?)方法 理想情况下,我只想对主实例使用默认的自动配置,但一旦我为外部实例注册了连接工厂,@conditionalonmissingbean({RedisConnectionFactory.class})中的条件将变为false,因此不会创建默认实例。查看LettuceConnectionConf

我的应用程序使用一个“主”redis实例进行会话存储和缓存,但出于其他原因,需要与一个单独的“外部”实例通信。我正试图确定在Spring Boot应用程序中配置此功能的“最佳”(“最惯用的”?“最简单”?)方法

理想情况下,我只想对主实例使用默认的自动配置,但一旦我为外部实例注册了连接工厂,
@conditionalonmissingbean({RedisConnectionFactory.class})
中的
条件将变为false,因此不会创建默认实例。查看
LettuceConnectionConfiguration
等中的其他情况。我觉得如果不需要,我宁愿不手动配置它

我不能将“外部”连接工厂作为bean公开,而只能在内部使用它来创建依赖于它的bean,但是,在我的具体情况下,这是可以的,我想了解是否有更好的解决方案可以公开这两个工厂


是否有某种方法可以公开第二个
RedisConnectionFactory
,而不禁用自动配置提供的默认设置?是否有明确的“正确方法”来执行此类操作?

您必须实现BeanDefinitionRegistryPostProcessor来调整RedisConnectionFactory顺序

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.stereotype.Component;

@Component
public class MultipleRedisConnectionFactoryRegistrar implements BeanDefinitionRegistryPostProcessor {
    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
        BeanDefinition bd1 = registry.getBeanDefinition("redisConnectionFactory");
        if (bd1 != null) {
            BeanDefinition bd = new RootBeanDefinition(ExternalRedisConnectionFactoryBean.class);
            registry.registerBeanDefinition("externalRedisConnectionFactory", bd);
        }
    }

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {

    }
}
在ExternalRedisConnectionFactoryBean中,您可以创建自己的RedisConnectionFactory

import org.springframework.beans.factory.FactoryBean;
import org.springframework.data.redis.connection.RedisConnectionFactory;

public class ExternalRedisConnectionFactoryBean implements FactoryBean<RedisConnectionFactory> {
    @Override
    public RedisConnectionFactory getObject() throws Exception {
        //you can mannually create your external redis connection factory here
        return null;
    }

    @Override
    public Class<?> getObjectType() {
        return RedisConnectionFactory.class;
    }
}
@Autowired
@Qualifier("redisConnectionFactory")
private RedisConnectionFactory defaultRedisConnectionFactory;

@Autowired
@Qualifier("externalRedisConnectionFactory")
private RedisConnectionFactory externalRedisConnectionFactory;