Несколько RedisConnectionFactories в приложении Spring Boot
Мое приложение использует один "основной" экземпляр redis для таких вещей, как хранение сеанса и кэш, но по другим причинам ему нужно общаться с отдельным "внешним" экземпляром. Я пытаюсь определить "лучший" ("самый идиоматичный"? "Самый простой"?) Способ настройки этого в моем приложении Spring Boot.
В идеале я бы хотел использовать автоконфигурацию по умолчанию для основного экземпляра, но как только я зарегистрирую фабрику соединений для внешнего экземпляра, @ConditionalOnMissngBean({RedisConnectionFactory.class})
состояние в LettuceConnectionConfiguration
становится ложным, и поэтому экземпляр по умолчанию не создается. Глядя на то, что еще происходит в LettuceConnectionConfiguration
и т.д. Я чувствую, что предпочел бы не настраивать его вручную, если мне это не нужно.
Я мог бы просто не выставлять "внешнюю" фабрику соединений как bean-компонент и использовать ее только внутренне для создания bean-компонентов, которые зависят от него, но, хотя это было бы нормально в моем конкретном случае, я хотел бы понять, есть ли лучшее решение где обе фабрики могут быть выставлены.
Есть ли способ, которым я могу выставить второй RedisConnectionFactory
без отключения настройки по умолчанию, предоставляемой автоматической настройкой? Есть ли четкий "правильный путь" для такого рода вещей?
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;