在使用 Spring Data Redis 框架时,需要使用 RedisTemplate
对象来实现操作的 Redis,需要使用 Spring 来注入 RedisTemplate
:
@Autowired
private RedisTemplate<String, Object> redisTemplate;
但是这样的注入方式是错误的,@Autowired
注解是根据类型进行注入,Spring 会从 IoC 容器中找到对应类型的 Bean 然后给域赋值,但是注意在这里声明的是 RedisTemplate<String, Object>
,多了一个泛型,而 IoC 容器里面并没有声明这个 Bean,所以无法实现注入,容器自动装配的是 RedisTemplate<Object, Object>
,所以会报错:
No qualifying bean of type ‘org.springframework.data.redis.core.RedisTemplate< java.lang.String, java.lang.Object>
最简单的解决方法就是去掉泛型,这样就不会报错了,但是 IDEA 会给出令人不舒服的警告,强迫症患者会十分难受。是否有其他解决方法呢?
肯定有的,那就是使用 @Resource
注解,@Resource
注解是根据 id 进行注入,假如没有找到对应的类型的 Bean,那么就会去找有对应的 id 的 Bean 进行注入。所以 @Resource
注解更加万能一点。
@Resource
private RedisTemplate<String, Object> redisTemplate;
最后还有一种比较麻烦的方式,那就是自己配置 RedisTemplate<String, Object>
Bean。需要声明一个 Redis 配置类,声明需要的 Bean,这种方式多数是在你需要定制化 Spring Data Redis 的序列化方式的时候使用,比如指定 JSON 解析器 Bean。这样就可以使用 @Autowired
注解了。