Spring Cloud项目集成redis出错!怎么通过一点小细节加深对一个大知识点的理解

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.启示

虽然解决问题获得更多的知识技术很不错但是明显不应该出现这个问题,更深层的影响效率的原因是规范性的问题,最后解决也是想起来了日常的写法规范,规范很重要,加油,各位程序员们!

  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值