首页 文章

Spring Boot应用程序中的多个RedisConnectionFactories

提问于
浏览
0

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

理想情况下,我只想使用主实例的默认自动配置,但只要我为外部实例注册连接工厂, LettuceConnectionConfiguration 中的 @ConditionalOnMissngBean({RedisConnectionFactory.class}) 条件就会变为false,因此不会创建默认实例 . 看看 LettuceConnectionConfiguration 等发生了什么 . 我觉得我需要这样做 .

我可能不会将“外部”连接工厂公开为bean并且只在内部使用它来创建依赖它的bean但是,虽然在我的特定情况下这是可以的,但我想知道是否有更好的解决方案两个工厂都可以暴露在哪里 .

有没有什么方法可以暴露第二个 RedisConnectionFactory 而不禁用自动配置提供的默认值?是否有明确的"right way"做这种事情?

1 回答

  • 0

    您必须实现 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;
        }
    }
    

    如果你想使用多个RedisConnectionFactory,你 @Qualifier 是正确的选择,例如

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

相关问题