1.出现问题
Spring Cloud项目需要集成redis但是自己写的相关配置文件拿不到host和port两个参数,各种方法都尝试过了还是没有解决问题,代码如下:
@Configuration
public class RedisConfig {
@Autowired
private RedisConnectionFactory redisConnectionFactory;
@Value("${spring.redis.host}")
private String host;
@Value("${spring.redis.port}")
private int port;
@Bean
public RedisConnectionFactory redisConnectionFactory() {
//host="localhost";
//port=16379;
RedisStandaloneConfiguration configuration = new RedisStandaloneConfiguration(host, port);
return new JedisConnectionFactory(configuration);
}
@Bean
public RedisCacheManager cacheManager(RedisConnectionFactory redisTemplate) {
RedisCacheManager cacheManager = RedisCacheManager.builder(redisTemplate).build();
return cacheManager;
}
}
2.找到解决方案
检查了配置文件文字,名字,格式,中英文符号等一堆东西以后打算放弃这个方式换
@PropertySource和@ConfigurationProperties这2个来获取了参数的时候突然想起来@value都是写在文件的最前方的,所以转换了一下位置,没想到成功了,成功代码如下:
@Configuration
public class RedisConfig {
@Value("${spring.redis.host}")
private String host;
@Value("${spring.redis.port}")
private int port;
@Autowired
private RedisConnectionFactory redisConnectionFactory;
@Bean
public RedisConnectionFactory redisConnectionFactory() {
RedisStandaloneConfiguration configuration = new RedisStandaloneConfiguration(host, port);
return new JedisConnectionFactory(configuration);
}
@Bean
public RedisCacheManager cacheManager(RedisConnectionFactory redisTemplate) {
RedisCacheManager cacheManager = RedisCacheManager.builder(redisTemplate).build();
return cacheManager;
}
}
3.探索原因
@Value
注解和@Autowired
注解的使用方式没有本质区别。但是,如果将@Value
注解放在@Autowired
注解下方,可能会导致port
不能获取到参数的原因可能是:
循环依赖问题:如果在当前类中存在循环依赖的情况,即当前类依赖于其他类,而其他类又依赖于当前类,那么在注入过程中可能会出现问题。在这种情况下,Spring容器可能无法正确解析依赖关系,导致port
无法获取到参数。
4.解决方案
4.1方案1
确保没有循环依赖的情况存在。可以通过重新组织代码结构、使用构造函数注入等方式来避免循环依赖。
4.2方案2
确保正确的配置顺序。使用@Value
注解注入属性值,然后将@Autowired
注解放在后面。因为Spring容器的实例化是顺序获取的,所以确保正确的配置顺序就可以解决。
5.输出正确代码
@Configuration
public class RedisConfig {
@Value("${spring.redis.host}")
private String host;
@Value("${spring.redis.port}")
private int port;
@Bean
public RedisConnectionFactory redisConnectionFactory() {
RedisStandaloneConfiguration configuration = new RedisStandaloneConfiguration(host, port);
return new JedisConnectionFactory(configuration);
}
@Bean
public RedisCacheManager cacheManager(RedisConnectionFactory redisTemplate) {
RedisCacheManager cacheManager = RedisCacheManager.builder(redisTemplate).build();
return cacheManager;
}
}
6.启示
虽然解决问题获得更多的知识技术很不错但是明显不应该出现这个问题,更深层的影响效率的原因是规范性的问题,最后解决也是想起来了日常的写法规范,规范很重要,加油,各位程序员们!