Внедрение зависимости конфигурации - PullRequest
0 голосов
/ 04 декабря 2018

Я создаю оболочку клиента кеша, используя 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 будет использоваться в качестве компонента в приложении, которое будет использовать интерфейс оболочки.

Но чтобы скомпилировать мою обертку, я создал сам нулевой компонент.Затем, когда приложение использует его, будет два компонента, один из приложения и один из оболочки.

Как мне решить эту проблему?

1 Ответ

0 голосов
/ 01 апреля 2019

На самом деле я хотел, чтобы в моем клиентском приложении была конфигурация кластера в виде bean-компонента.Для этого мне не нужно объявлять @autowire clusterconfig в моем приложении-оболочке.Вместо этого следует принять конфигурацию кластера в качестве параметра в методе, чтобы клиент передал объект конфигурации кластера при создании компонента.И боб, который создается в клиентском коде, должен иметь код для создания фабрики соединений Redis.

Но все, что я писал, было сделать моего клиента неизвестным о redis.Итак, лучшее решение - иметь класс-обертку, который принимает конфигурацию кластера pojo и создает фабрику соединений Redis и т. Д. И клиент должен создать эту обертку в виде bean-компонента.

Очень плохое представление о шаблонах Spring и Design приводит меня к этой ошибке..

...