注入配置依赖

时间:2018-12-04 06:46:58

标签: spring spring-framework-beans

我正在使用spring框架创建一个缓存客户端包装。这是为我们的应用程序提供缓存层。现在,我们正在使用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 bean。

我的问题是如何使用此配置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作为应用程序中的bean,它将使用包装器接口。

但是要编译我的包装器,我自己创建了一个空bean。然后,当应用程序使用它时,将有两个bean,一个是应用程序,另一个是包装器。

我应该如何解决此问题?

1 个答案:

答案 0 :(得分:0)

实际上,我想要的是在客户端应用程序中将集群配置作为Bean。为此,我不需要在包装器应用程序中声明@autowire clusterconfig。相反,应在方法中将cluster config作为参数,以便客户端在创建bean时传递cluster config对象。并且在客户端代码中创建的Bean应该具有用于​​创建Redis连接工厂的代码。

但是我写的所有这些都是让我的客户不了解redis。因此,更好的解决方案是使用具有群集配置pojo的包装器类并创建redis连接工厂等。客户端应将此包装器创建为Bean。

弹簧和设计模式的概念很差,导致我犯了这个错误。