【问题标题】:Multiple RedisConnectionFactories in Spring Boot ApplicationSpring Boot 应用程序中的多个 RedisConnectionFactories
【发布时间】:2018-09-10 14:17:01
【问题描述】:

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

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

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

有没有什么方法可以公开第二个RedisConnectionFactory 而不会禁用自动配置提供的默认值?有没有明确的“正确方法”来做这种事情?

【问题讨论】:

    标签: spring spring-boot spring-java-config spring-data-redis


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2015-11-25
      • 2016-05-22
      • 2015-07-10
      • 2020-06-25
      • 1970-01-01
      • 2021-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-25
      相关资源
      最近更新 更多