〖Redis指南⑤〗RedisTemplate实例注入异常解决

问题描述

当RedisTemplate如下注入时,报错

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

报错信息

Unsatisfied dependency expressed through field ‘redisTemplate’; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type ‘org.springframework.data.redis.core.RedisTemplate<java.lang.String, java.lang.Object>’ available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

解决办法

    @Resource
    private RedisTemplate<String, Object> redisTemplate;

    @Autowired
    private RedisTemplate redisTemplate;

原理

If you add your own @Bean of any of the auto-configured types, it replaces the default (except in the case of RedisTemplate, when the exclusion is based on the bean name, redisTemplate, not its type).

RedisTemplate < String, String>和StringRedisTemplate

@Autowired
private RedisTemplate<String, String> redisTemplate;

@Autowired
private StringRedisTemplate stringRedisTemplate;

因为StringRedisTemplate类的父类就是RedisTemplate< String, String>,而Bean默认是单例的,两个是自然是同一个对象。

源码

public class StringRedisTemplate extends RedisTemplate<String, String> {
    
    

    /**
     * Constructs a new <code>StringRedisTemplate</code> instance. {@link #setConnectionFactory(RedisConnectionFactory)}
     * and {@link #afterPropertiesSet()} still need to be called.
     */
    public StringRedisTemplate() {
    
    
        RedisSerializer<String> stringSerializer = new StringRedisSerializer();
        setKeySerializer(stringSerializer);
        setValueSerializer(stringSerializer);
        setHashKeySerializer(stringSerializer);
        setHashValueSerializer(stringSerializer);
    }

    /**
     * Constructs a new <code>StringRedisTemplate</code> instance ready to be used.
     * 
     * @param connectionFactory connection factory for creating new connections
     */
    public StringRedisTemplate(RedisConnectionFactory connectionFactory) {
    
    
        this();
        setConnectionFactory(connectionFactory);
        afterPropertiesSet();
    }

    protected RedisConnection preProcessConnection(RedisConnection connection, boolean existingConnection) {
    
    
        return new DefaultStringRedisConnection(connection);
    }
}

猜你喜欢

转载自blog.csdn.net/CSDN_SAVIOR/article/details/125026346