工作的时候写了一个redis底层工具jar包,因为环境不同导致redis的连接配置不同,所以在用@PropertySource,学习了分环境读取文件。
如果springboot项目比较简单直接加个占位符即可,但如果不是springboot项目,则需要用上自定义的factory
JedisSpringConfig.java 类
@Configuration
@PropertySource(value = {"classpath:redis-config-${spring.profiles.active:value}.properties"},factory = SystemPropertySourceFactory.class)
public class JedisSpringConfig {
@Value("${redis.maxTotal}")
private int maxTotal;
@Value("${redis.maxIdle}")
private int maxIdle;
@Value("${redis.minIdle}")
private int minIdle;
@Value("${redis.maxWaitMillis}")
private int maxWaitMillis;
@Value("${redis.cluster.nodes}")
private String nodes;
@Value("${redis.connetcion.timeout}")
private int connectionTimeout;
@Value("${redis.connetcion.soTimeout}")
private int soTimeout;
@Value("${redis.connetcion.maxAttempts}")
private int maxAttempts;
@Value("${redis.common.key}")
private String password;
@Bean
public GenericObjectPoolConfig getGenericObjectPoolConfig(){
GenericObjectPoolConfig genericObjectPoolConfig=new GenericObjectPoolConfig();
genericObjectPoolConfig.setTestOnBorrow(true);
genericObjectPoolConfig.setMaxTotal(maxTotal);
genericObjectPoolConfig.setMaxIdle(maxIdle);
genericObjectPoolConfig.setMinIdle(minIdle);
genericObjectPoolConfig.setMaxWaitMillis(maxWaitMillis);
return genericObjectPoolConfig;
}
@Bean
public JedisClusterConfig getJedisClusterConfig(){
JedisClusterConfig jedisClusterConfig=new JedisClusterConfig();
jedisClusterConfig.setNodes(nodes);
jedisClusterConfig.setConnectionTimeout(connectionTimeout);
jedisClusterConfig.setSoTimeout(soTimeout);
jedisClusterConfig.setMaxAttempts(maxAttempts);
jedisClusterConfig.setPassword(password);
jedisClusterConfig.setPoolConfig(getGenericObjectPoolConfig());
return jedisClusterConfig;
}
@Bean
public JedisClusterUtil getJedisClusterUtil() throws Exception{
JedisClusterUtil jedisClusterUtil=new JedisClusterUtil();
jedisClusterUtil.setJedisCluster(getJedisClusterConfig().getObject());
return jedisClusterUtil;
}
}
如代码springboot只需要配置spring.profiles.active即可以区分环境,单要兼容spring 需要自定义配置,继承PropertySourceFactory
SystemPropertySourceFactory类
@Configuration
public class SystemPropertySourceFactory implements PropertySourceFactory {
@Override
public PropertySource<?> createPropertySource(String name, EncodedResource encodedResource) throws IOException {
//判断是否被替换
if(encodedResource.getResource().getFilename().contains("value")) {
ResourceBundle configBudle = ResourceBundle.getBundle("spring-redis");
String profile = configBudle.getString("spring.profile.redis");
String fileName = encodedResource.getResource().getFilename().replace("value", profile);
InputStream in2 = this.getClass().getResourceAsStream("/" + fileName);
InputStreamResource inputStreamResource = new InputStreamResource(in2);
return new ResourcePropertySource(new EncodedResource(inputStreamResource));
}else {
return new ResourcePropertySource(encodedResource);
}
}
}
这样就可以实现分环境读取文件了