Внедрение зависимости в классе Config
Я создаю кеш клиента с помощью Spring Framework. Это делается для того, чтобы обеспечить кеш-слой для нашего приложения. Прямо сейчас мы используем Redis. Я обнаружил, что библиотека spring-data-redis очень хороша для создания моей обертки.
Мое приложение передаст конфигурацию POJO моей оболочке, а затем будет использовать интерфейс, который я предоставлю.
spring-data-redis предоставляет простой способ доступа к redis с использованием двух переменных.
RedisConnectionFactory
RedisTemplate<String, Object>
Хотя я буду предоставлять лучший интерфейс для моего приложения с такими функциями интерфейса, как:
public Object getValue( final String key ) throws ConfigInvalidException;
public void setValue( final String key, final Object value ) throws ConfigInvalidException;
public void setValueWithExpiry(final String key, final Object value, final int seconds, final TimeUnit timeUnit) throws ConfigInvalidException;
Я все еще хочу предоставить компоненты RedisConnectionFactory и RedisTemplate.
Мой вопрос заключается в том, как инициализировать мое приложение-оболочку с этой конфигурацией POJO?
В настоящее время моя конфигурация выглядит так:
import java.util.List;
public class ClusterConfigurationProperties {
List<String> nodes;
public List<String> getNodes() {
return nodes;
}
public void setNodes(List<String> nodes) {
this.nodes = nodes;
}
}
И мой AppConfig.java выглядит так:
import com.ajio.Exception.ConfigInvalidException;
import com.ajio.configuration.ClusterConfigurationProperties;
import com.ajio.validator.Validator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisClusterConfiguration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericToStringSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration
public class AppConfig {
@Autowired
private ClusterConfigurationProperties clusterConfigurationProperties;
@Autowired
private Validator validator;
@Bean
ClusterConfigurationProperties clusterConfigurationProperties() {
return null;
}
@Bean
Validator validator() {
return new Validator();
}
@Bean
RedisConnectionFactory connectionFactory() throws ConfigInvalidException {
if (clusterConfigurationProperties == null)
throw new ConfigInvalidException("Please provide a cluster configuration POJO in context");
validator.validate(clusterConfigurationProperties);
return new JedisConnectionFactory(new RedisClusterConfiguration(clusterConfigurationProperties.getNodes()));
}
@Bean
RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) throws ConfigInvalidException {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(connectionFactory());
redisTemplate.setKeySerializer( new StringRedisSerializer() );
redisTemplate.setHashValueSerializer( new GenericToStringSerializer<>( Object.class ) );
redisTemplate.setValueSerializer( new GenericToStringSerializer<>( Object.class ) );
return redisTemplate;
}
}
Здесь я ожидаю, что ClusterConfigurationProperties POJO будет использоваться в качестве компонента в приложении, которое будет использовать интерфейс оболочки.
Но чтобы скомпилировать мою оболочку, я создал сам нулевой компонент. Затем, когда приложение использует его, будет два компонента, один из приложения и один из оболочки.
Как мне решить эту проблему?
0 ответов
На самом деле я хотел иметь кластерный конфиг в качестве компонента в моем клиентском приложении. Для этого мне не нужно объявлять @autowire clusterconfig в моем приложении-оболочке. Вместо этого следует принять конфигурацию кластера в качестве параметра в методе, чтобы клиент передал объект конфигурации кластера при создании компонента. И боб, который создается в клиентском коде, должен иметь код для создания фабрики соединений Redis.
Но все, что я писал, было сделать мой клиент неизвестным о Redis. Итак, лучшее решение - иметь класс-оболочку, который принимает конфигурацию кластера pojo и создает фабрику соединений redis и т. Д. И клиент должен создать эту оболочку в виде bean-компонента.
Очень плохое представление о весне и дизайне приводит меня к этой ошибке.