[英]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.