前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何优雅解决SpringBoot中注入StringRedisTemplate异常

如何优雅解决SpringBoot中注入StringRedisTemplate异常

作者头像
小熊学Java
发布2023-07-12 15:24:16
1.6K0
发布2023-07-12 15:24:16
举报
文章被收录于专栏:全栈学习之路全栈学习之路

报错信息

代码语言:javascript
复制
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”类型

原因
代码语言:javascript
复制
@Configuration
public class MvcConfig implements WebMvcConfigurer {

    @Resource
    private StringRedisTemplate redisTemplate;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoginInterceptor(redisTemplate))
                .excludePathPatterns(
                        "/user/code",
                        "/user/login",
                        "/blog/hot",
                        "/shop/**",
                        "/shop-type/**",
                        "/voucher/**"
                );
    }
}

注入Bean的时候采用的@resource注解,而它默认取字段名,按照名称注入

解决方案
  • @Resource改为@AutoWired
  • private StringRedisTemplate redisTemplate;改为private StringRedisTemplate stringRedisTemplate;
拓展@Resource@AutoWired
一、定义
  • @Autowired

对类成员变量、方法及构造函数进行标注,完成自动装配的工作。

  • @Resource

在语义上被定义为通过其唯一的名称来标识特定的目标组件,其中声明的类型与匹配过程无关。

二、区别

在Spring框架中,如果在Service层中需要注入其他依赖的对象,通常我们都会使用@Autowired或者@Resource注解,但是它们是有区别的,比如@Autowired跟Spring框架强耦合了, 如果换成其他框架,@Autowired就没作用了。而@Resource是JSR-250提供的,它是Java标准,绝大部分框架都支持。

(一)、包含的属性不同

@Autowired只包含一个参数:required,表示是否开启自动注入,默认是true。而@Resource包含七个参数,其中最重要的两个参数是:name 和 type。

(二)、@Autowired默认按byType自动装配,而@Resource默认byName自动装配。

@Autowired如果要使用byName,需要使用@Qualifier一起配合。而@Resource如果指定了name,则用byName自动装配,如果指定了type,则用byType自动装配。

(三)、注解应用的地方不同

@Autowired能够用在:构造器、方法、参数、成员变量和注解上,而@Resource能用在:类、成员变量和方法上。

(四)、出处不同

@Autowired是Spring定义的注解,而@Resource是JSR-250定义的注解。所以@Autowired只能在Spring框架下使用,而@Resource则可以与其他框架一起使用。

(五)、装配顺序不同

@Autowired的装配顺序如下:

@Autowired默认先按byType进行匹配,如果发现找到多个bean,则又按照byName方式进行匹配,如果还有多个,则报出异常。

@Resource的装配顺序如下:

如果同时指定了name和type,流程如下:

如果指定了name,流程如下:

只是指定了@Resource注解的name,则按name后的名字去bean元素里查找有与之相等的name属性的bean。

如果指定了type,流程如下:

只指定@Resource注解的type属性,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常。

如果既没有指定name,也没有指定type,流程如下:

既不指定name属性,也不指定type属性,则自动按byName方式进行查找。如果没有找到符合的bean,则回退为一个原始类型进行进行查找,如果找到就注入。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-06-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小熊学Java 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 报错信息
    • 原因
      • 解决方案
        • 拓展@Resource与@AutoWired
          • 一、定义
          • 二、区别
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档