相关推荐recommended
Bean named ‘redisTemplate‘ is expected to be of type ‘org.springframework.data.redis.core.StringRedi
作者:mmseoamin日期:2024-01-19

本文将讲解:

  1. 该错误的解决办法
  2. @Resource和@Autowired 两个注解的区别
  3. @Autowired这个注解注入的字段爆红

今天在引入redis作为缓存中间件的时候,出现了这个错误,org.springframework.beans.factory.UnsatisfiedDependencyException,其实就是我们自动注入的时候报的错误,使用@Resouce这个注解,因为这个注解我们是先通过名字去匹配的,然后再通过type去匹配的

报错详细信息:

Bean named 'redisTemplate' is expected to be of type 'org.springframework.data.redis.core.StringRedisTemplate' but was actually of type 'org.springframework.data.redis.core.RedisTemplate'

名为“redisTemplate”的Bean应该属于“org.springframework.data.redis.core.StringRedisTemplate”类型,但实际上是“org.springframework.data.redis.core.RedisTemplate”类型。

出现这个问题的就是,我们在自动装配的时候没有找到该名字的bean,然后通过类型查找也没有查询到

解决方案:

1.改为@Autowired注入

@Autowired

StringRedisTemplate redisTemplate;

2.改为字段名

@Resource

StringRedisTemplate stringRedisTemplate;

今天就在这里浅谈一下 @Resource和@Autowired 两个注解的区别

@Autowired

  • 这个注解是spring提供的
  • 按照type查找bean,他是在spring容器中去查找有没有这个type的bean
  • 如果我们使用@Qualifier注解声明了name,则从结果集中取出与该name相匹配的bean返回(此时可以视为通过name和type获取bean,但实质是先通过type获取所有bean,然后通过name筛选
  • 如果没有使用@Qualifier注解,且找到多个bean,则判断这些bean中是否有使用@Primary注解和@Priority注解,有就返回优先级最高的哪一个bean,没有就按照字段名称去匹配bean,匹配成功返回,不成功抛出异常。

    如果还需要详细的了解,可以去查看一下源码 findAutowireCandidates()和determineAutowireCandidate()这个两个方法的源码

    @Resource

    • 这个注解是由jdk提供的
    • 按照name属性查找,如果我们没有指定name属性,则会把name属性值处理为字段名
    • 先按照name属性值注入,若未找到,则按照type属性值注入

      @Autowired注入字段爆红

      场景描述:

      Bean named ‘redisTemplate‘ is expected to be of type ‘org.springframework.data.redis.core.StringRedi,场景描述,第1张


      原因分析:

      因为这个注解是spring提供的注解,他会按照type去spring容器中查找这个bean,如果这里爆红的话,那就是没有头把这个注入到spring容器中,找不到这个bean

      Bean named ‘redisTemplate‘ is expected to be of type ‘org.springframework.data.redis.core.StringRedi,原因分析,第2张

      解决办法一:

      在需要使用@Autowired注入的类上添加@Repository注解即可,这个注解是Spring的注解,作用是把当前类注册到Srping容器中实例化为一个bean,这样的话@Autowired就可以找到这个bean了

      这里如果是我们的工具类的话,建议使用 @Component这个注解

      因为上面那个注解主要用于dao层,用来确定类的标识作用(约定)

      解决办法二:

      将@Autowired注解替换成@Resource注解,该注解是JDK内部的注解,不会向@Autowired那样去Spring容器中寻找bean。

      使用@Resource我们需要注意名字不能写错或者少写

      Bean named ‘redisTemplate‘ is expected to be of type ‘org.springframework.data.redis.core.StringRedi,解决结果,第3张

      这边文章就浅谈到这里,写的不好的地方大家多多担待指正,谢谢大家