我的应用程序使用一个“主”redis实例来处理会话存储和缓存,但出于其他原因需要与单独的“外部”实例进行通信。我试图确定在我的Spring Boot应用程序中配置它的“最佳”(“最惯用”?“最简单”?)方式。
理想情况下,我只想使用主实例的默认自动配置,但只要我为外部实例注册连接工厂,@ConditionalOnMissngBean({RedisConnectionFactory.class})
中的LettuceConnectionConfiguration
条件就会变为false,因此不会创建默认实例。看看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;