背景:提供一个spi的功能,由于需要支持不同环境连不同的redis,同时使用方也可能会用到自身应用的redis。因此,考虑让使用方配置一个指定的环境变量来初始化不同环境的redis配置。
具体实现步骤:
1.编写不同环境的properties文件,放丰META-INF目录下
2.分别编写配置类,如RedisDevConfig、RedisTestConfig
- 在配置类上打上注解@ConfigurationProperties(prefix="spring.redis-dev")、@ConditionalOnProperty(name="使用方指定环境的参数",havingValue="环境参数值,如dev")
- 在类中指定类,用于读取properties文件
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.PropertySourcesPlaceholderConfigurer;
import org.springframework.stereotype.Component;
@ConfigurationProperties(prefix="spring.redis-spi")
@ConditionalOnProperty(name="spring.redis-spi.env",havingValue="dev")
@Component
public class RedisDevConfig{
@Bean
public static PropertySourcesPlaceholderConfigurer placeholderConfigurer(){
return new PropertySourcesPlaceholderConfigurer();
}
@Bean(name="redisSpiTemplate")
public <T> RedisTemplate<String,T> redisSpiTemplate(){
RedisStandaloneConfiguration configuration = new RedisStandaloneConfiguration();
//按实际情况配置以下信息
configuration.setHostName("");
configuration.setPort();
configuration.setPassword();
configuration.setDatabase();
//连接池配置
GenericObjectPoolConfig genericObjectPoolConfig = new GenericObjectPoolConfig();
genericObjectPoolConfig.setMaxWaitMillis(100);
genericObjectPoolConfig.setMaxIdle(100);
genericObjectPoolConfig.setMinIdle(100);
//Lettuce Pool
LettucePoolingClientConfiguration.LettucePoolingClientConfigurationBuilder builder = LettucePoolingClientConfiguration.builder();
builder.poolConfit(genericObjectPoolConfig);
builder.commandTimeout(100);
LettuceConnectionFactory lettuceConnectionFactory = new LettuceConnectionFactory (configuration,builder.build());
lettuceConnectionFactory.afterPropertiesSet();
return createRedisTemplate(lettuceConnectionFactory);
}
private<T> RedisTemplate<String,T> createRedisTemplate(RedisConnectionFactory redisConnectionFactory){
RedisTemplate<String,T> redisTemplate = new RedisTemplate();
redisTemplate.setConnectionFactory(redisConnectionFactory);
RedisSerializer redisSerializer = redisTemplate.getStringSerializer();
redisTemplate.setKeySerializer(redisSerializer);
redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer());
redisTemplate.setHashKeySerializer(redisSerializer);
redisTemplate.setHashValueSerializer(new JdkSerializationRedisSerializer());
return redisTemplate;
}
}
- 在META-INF/spring.factories中加入以上配置类
3.使用方引入spi的jar包,如果使用方本身需要自己的redis配置,需要添加自己的配置类与spi中的redis配置相区分,否则会将只能使用spi中的redis.
4.使用方添加指定的配置参数,等启动时,spi中的redis的配置就会自动连接。