Spring Boot应用程序中的多个RedisConnectionFactories

问题描述 投票:0回答:1

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

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

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

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

spring spring-boot spring-java-config spring-data-redis
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;
© www.soinside.com 2019 - 2024. All rights reserved.