代码之家  ›  专栏  ›  技术社区  ›  prakharjain

在配置类中注入依赖项

  •  0
  • prakharjain  · 技术社区  · 6 年前

    我正在使用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,它将使用wrapper的接口。

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

    我该如何解决这个问题?

    0 回复  |  直到 5 年前
        1
  •  0
  •   prakharjain    5 年前

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

    但我写这些只是为了让我的客户对redis一无所知。因此,更好的解决方案是使用wrapper类,该类接受集群配置pojo和创建redis连接工厂等,而客户端应该将此包装器创建为bean。

    非常糟糕的弹簧概念和设计模式导致了这个错误。