springboot整合redis,redisTemplate空指针
今天创建了⼀个springboot项⽬,想整合⼀下redis数据库,结果redisTemplate⼀直未空指针异常,最后总结:出现在的原因有两点
1.对@Autowired和@Resource不熟
2.对spring依赖注⼊和new没搞明⽩
废话少说,先贴上错误代码让⼤家看看截图配合粘贴代码
l中加⼊对redis的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
l中配置redis
redis:
host: 127.0.0.1
port: 6379resource和autowired注解的区别
3.编写redis⼯具类
@Component
public class RedisUtils {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
/**
* 根据key查询string类型
*
* @param key
* @return
*/
public Object getString(String key) {
return key == null ? null : redisTemplate.opsForValue().get(key);
}
}
启动项⽬就会报错,下⾯是报错的信息:
Field redisTemplate in redis.utils.RedisUtil required a bean of type 'org.RedisTemplate' that could not be found.
The injection point has the following annotations:
- @org.springframework.beans.factory.annotation.Autowired(required=true)
也就是说没有到RedisTemplate这个对象,后来百度后才知道原来RedisTemplate<Object,Object>这个bean的key-value默认的泛型都是Object类型的,如果在上⾯的⼯具类中,想要引⼊这个对象,有两种⽅式
1.⽤@Resource注解
@Resource
private RedisTemplate<String,Object>  redisTemplate;
2.⽤@Autowired注解
@Autowired
private RedisTemplate  redisTemplate;
因为RedisTemplate这个bean的key默认是Object类型的,所以在依赖注⼊的时候,想将key改为String类型的,所以问题就出在了这⾥。@Autowired这个注解是根据类型来讲bean注⼊的,RedisTemplate这个bean在Spring容器中是下图这个样⼦
的,RedisTemplate<Object,Object>,⽽我上⾯写的是RedisTemplate<String,Object>,根据类型,Spring容器中没有到,所以就会报错了;⽽如果⽤@Resource的话就可以,因为@Resource这个注解是根据名称在Spring容器中寻bean的,所以没有问题,这个就是@Autowired和@Resource两个注解的区别
下⾯看调⽤redis⼯具类的⼀层
报空指针异常,然后将代码改为这样就OK了
为什么会出现这样的情况呢?
这就是⽂章刚开写的第⼆个问题了,对spring依赖注⼊和new没搞明⽩
在写redisUtil⼯具类的时候,已经将redisTemplate依赖注⼊了,这个对象是Spring容器提供的,根据Application.properties的redis配置,redisTemplate已经被Spring封装好了,如果在⽤redisUtil时,去new这个对象的话,就会是⼀个新的对象,这个新的redisUtil对象中的redisTemplate对象在Spring容器中也是⼀个新的对象,⽽且是⼀个空的对象,所以在调⽤的时候redisTemplate会报空指针异常

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。