Spring Redis - 从application.properties文件中读取配置

时间:2015-12-10 11:50:06

标签: java spring configuration redis

我使用spring-data-redis使用Spring Redis,所有默认配置均为localhost默认port,依此类推。

现在我尝试通过在application.properties文件中配置它来进行相同的配置。但我无法弄清楚我应该如何创建完全符合我的属性值的bean。

Redis配置文件

@EnableRedisHttpSession
@Configuration
public class SpringSessionRedisConfiguration {

@Bean
JedisConnectionFactory connectionFactory() {
    return new JedisConnectionFactory();
}

@Autowired
@Bean
RedisCacheManager redisCacheManager(final StringRedisTemplate stringRedisTemplate) {
    return new RedisCacheManager(stringRedisTemplate);
}

@Autowired
@Bean
StringRedisTemplate template(final RedisConnectionFactory connectionFactory) {
    return new StringRedisTemplate(connectionFactory);
}
}

application.properties中的标准参数

  

spring.redis.sentinel.master =大师

     

spring.redis.sentinel.nodes = 192.168.188.231:26379

     

spring.redis.password = 12345

我尝试了什么,

  1. 我可以使用@PropertySource然后注入@Value并获取值。但我不想那样做,因为这些属性不是由我定义的,而是来自Spring。
  2. 在本文档Spring Redis Documentation中,它仅表示可以使用属性进行配置,但不会显示具体示例。
  3. 我还浏览了Spring Data Redis API类,发现RedisProperties应该对我有帮助,但仍然无法弄清楚如何告诉Spring从属性文件中读取。

8 个答案:

答案 0 :(得分:27)

您可以使用@PropertySource从application.properties或其他所需的属性文件中读取选项。请查看PropertySource usage example并使用example of usage spring-redis-cache。或者看看这个小样本:

@Configuration
@PropertySource("application.properties")
public class SpringSessionRedisConfiguration {

    @Value("${redis.hostname}")
    private String redisHostName;

    @Value("${redis.port}")
    private int redisPort;

    @Bean
    public static PropertySourcesPlaceholderConfigurer    propertySourcesPlaceholderConfigurer() {
        return new PropertySourcesPlaceholderConfigurer();
    }

    @Bean
    JedisConnectionFactory jedisConnectionFactory() {
        JedisConnectionFactory factory = new JedisConnectionFactory();
        factory.setHostName(redisHostName);
        factory.setPort(redisPort);
        factory.setUsePool(true);
        return factory;
    }

    @Bean
    RedisTemplate<Object, Object> redisTemplate() {
        RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<Object, Object>();
        redisTemplate.setConnectionFactory(jedisConnectionFactory());
        return redisTemplate;
    }

    @Bean
    RedisCacheManager cacheManager() {
        RedisCacheManager redisCacheManager = new RedisCacheManager(redisTemplate());
        return redisCacheManager;
    }
}

目前( 2015年12月application.properties中的 spring.redis.sentinel 选项对RedisSentinelConfiguration的支持有限:

  

请注意,目前只有Jedis和生{Lettuce支持Redis Sentinel。

您可以在official documentation中详细了解相关内容。

答案 1 :(得分:6)

看得更深,我发现了这个,这可能是你想要的吗?

# REDIS (RedisProperties)
spring.redis.database=0 # Database index used by the connection factory.
spring.redis.host=localhost # Redis server host.
spring.redis.password= # Login password of the redis server.
spring.redis.pool.max-active=8 # Max number of connections that can be allocated by the pool at a given time. Use a negative value for no limit.
spring.redis.pool.max-idle=8 # Max number of "idle" connections in the pool. Use a negative value to indicate an unlimited number of idle connections.
spring.redis.pool.max-wait=-1 # Maximum amount of time (in milliseconds) a connection allocation should block before throwing an exception when the pool is exhausted. Use a negative value to block indefinitely.
spring.redis.pool.min-idle=0 # Target for the minimum number of idle connections to maintain in the pool. This setting only has an effect if it is positive.
spring.redis.port=6379 # Redis server port.
spring.redis.sentinel.master= # Name of Redis server.
spring.redis.sentinel.nodes= # Comma-separated list of host:port pairs.
spring.redis.timeout=0 # Connection timeout in milliseconds. 

参考:https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html Searchterm Redis

从我所看到的值已经存在并被定义为

spring.redis.host=localhost # Redis server host.
spring.redis.port=6379 # Redis server port.

如果您想创建自己的属性,可以查看我在此主题中的上一篇文章。

答案 2 :(得分:1)

我在spring boot doc第24节第7段中找到了这个

@Component
@ConfigurationProperties(prefix="connection")
public class ConnectionSettings {

    private String username;

    private InetAddress remoteAddress;

    // ... getters and setters

} 

然后可以通过connection.property

修改属性

参考链接:https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html#boot-features-external-config-typesafe-configuration-properties

答案 3 :(得分:1)

这是解决您问题的优雅解决方案:

@Configuration
@PropertySource(name="application", value="classpath:application.properties")
public class SpringSessionRedisConfiguration {

    @Resource
    ConfigurableEnvironment environment;

    @Bean
    public PropertiesPropertySource propertySource() {
        return (PropertiesPropertySource) environment.getPropertySources().get("application");
    }

    @Bean
    public JedisConnectionFactory jedisConnectionFactory() {
        return new JedisConnectionFactory(sentinelConfiguration(), poolConfiguration());
    }

    @Bean
    public RedisSentinelConfiguration sentinelConfiguration() {
        return new RedisSentinelConfiguration(propertySource());
    }

    @Bean
    public JedisPoolConfig poolConfiguration() {
        JedisPoolConfiguration config = new JedisPoolConfiguration();
        // add your customized configuration if needed
        return config;
    }

    @Bean
    RedisTemplate<Object, Object> redisTemplate() {
        RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<Object, Object>();
        redisTemplate.setConnectionFactory(jedisConnectionFactory());
        return redisTemplate;
    }

    @Bean
    RedisCacheManager cacheManager() {
        return new RedisCacheManager(redisTemplate());
    }

}

所以,要恢复:

  • 为@PropertySource添加特定名称
  • 注入ConfigurableEnvironment而不是Environment
  • 使用您在@PropertySource
  • 上提到的名称在ConfigurableEnvironment中获取PropertiesPropertySource
  • 使用此PropertySource对象构造RedisSentinelConfiguration对象
  • 别忘了添加spring.redis.sentinel.master&#39;和&#39; spring.redis.sentinel.nodes&#39;属性文件中的属性

在我的工作区中测试过, 此致

答案 4 :(得分:1)

这对我有用:

@Configuration
@EnableRedisRepositories
public class RedisConfig {

    @Bean
    public JedisConnectionFactory jedisConnectionFactory() {
        RedisProperties properties = redisProperties();
        RedisStandaloneConfiguration configuration = new RedisStandaloneConfiguration();
        configuration.setHostName(properties.getHost());
        configuration.setPort(properties.getPort());

        return new JedisConnectionFactory(configuration);
    }

    @Bean
    public RedisTemplate<String, Object> redisTemplate() {
        final RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(jedisConnectionFactory());
        template.setValueSerializer(new GenericToStringSerializer<>(Object.class));
        return template;
    }

    @Bean
    @Primary
    public RedisProperties redisProperties() {
        return new RedisProperties();
    }

}

和属性文件:

spring.redis.host=localhost
spring.redis.port=6379

答案 5 :(得分:0)

您可以使用ResourcePropertySource生成PropertySource对象。

PropertySource propertySource = new ResourcePropertySource("path/to/your/application.properties");

然后将其传递给RedisSentinelConfiguration的构造函数。

答案 6 :(得分:0)

在每个测试班级使用@DirtiesContext(classMode = classmode.AFTER_CLASS)。这肯定对您有用。

答案 7 :(得分:-1)

@Autowired
private JedisConnectionFactory connectionFactory;

@Bean
JedisConnectionFactory connectionFactory() {
    return connectionFactory
}
相关问题