簡體   English   中英

Spring Boot應用程序中的多個RedisConnectionFactories

[英]Multiple RedisConnectionFactories in Spring Boot Application

我的應用程序使用一個“主” redis實例來進行會話存儲和緩存之類的操作,但由於其他原因,需要與單獨的“外部”實例進行對話。 我正在嘗試確定在Spring Boot應用程序中進行配置的“最佳”(“最慣用”或“最簡單”?)方式。

理想的情況是我只是想使用默認的自動配置為主要實例,但只要我的外部實例注冊一個連接工廠@ConditionalOnMissngBean({RedisConnectionFactory.class})在條件LettuceConnectionConfiguration為假,因此默認實例未創建。 看看LettuceConnectionConfiguration等中發生了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;
    }
}

如果要使用多個RedisConnectionFactory,則@Qualifier是正確的選擇,例如

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM