@Autowired为什么会报错?如何解决?

news2024/9/21 8:02:10

b6691120467d40261f96e35797cd49b6.png

作者 | 磊哥

来源 | Java中文社群(ID:javacn666)

转载请联系授权(微信ID:GG_Stone)

@Autowired报错信息相信大部分程序员都遇到过,奇怪的是虽然代码报错,但丝毫不影响程序的正常执行,也就是虽然编译器 IDEA 报错,但程序却能正常的执行,那这其中的原因又是为何?

报错原因分析

报错的原因首先是因为 IDEA 强大的报警机制,@Autowired 为 Spring 的注解,含义是将某类动态的注入到当前类中,如下图所示:


c4db72bee97d67b87b11b9521d114504.png

@Autowired 默认是根据 type 进行注入,并且注入时要求(注入)对象不能为 NULL,默认值如下图所示:


255a7206d5fc49ce3a75a3c5130bf113.png

IDEA 报错的原因是:@Autowired 为 Spring 的注解,而注入的 Mapper 对象使用的又是 @Mapper 的注解,然而 @Mapper 又为 MyBaits 的注解,IDEA 能很好的兼容并识别 Spring 的注解,但不能很好的识别 MyBatis 的注解,因此在使用 @Autowired 注解时,IDEA 并不能检测到 @Mapper 注解的对象不为 NULL,因此就会报错。


fc6c28d8c4455345f08c62278d5356bd.png

这就是为什么使用 Spring 的注解 @Repository/@Component... 不报错,而使用 @Mapper 注解却会报错的根本原因,如下图所示:


931cd0ad59020c6f1ea9e57ec20bee9b.png14d616b7390228b9fc5d64496fce7a63.png3b2765448138b9dfe4300c76a1c44400.png

解决方案1:关闭报警机制

关闭 IDEA 注入报警机制,可以避免报错,实现步骤如下。

1.打开 IDEA,找到参数设置选项 “Preferences...” ,如下图所示:


a735cdbe82c25385ca044b06cbea652d.png

2.依次选择 “Editor” -> “Inspections” -> “Spring” -> “Spring Core” -> “Code” -> “Autowiring for bean class” 将 “Error” 级别修改成 “Waring” 级别,如下图所示:


80ed337ff7f4b676e5cdfad1b96781da.png

设置完成之后点击确认,查看之前报错的 Mapper 类,此时展示效果如下:


3ac78ae3025b6a419389d4ebdd14b312.png

报错信息消失了。

解决方案2:添加Spring注解

在 Mapper 的类上添加 Spring 的注解,也可以解决 IDEA 报错的问题,如 @Repository 或 @Component 这类注解,如下图所示:


08df5799e5dc61c851cd8f34ba607928.png

或使用 @Repository 注解,如下图所示:


3d036eedb57bf1c3b0b189bc76ccf10d.png

查看之前的报错信息:


e09d21d4f26e88de734b743642d2f3a3.png

报错消失了。

解决方案3:允许注入对象为NULL

设置允许注入的 Mapper 对象为 NULL,也可以避免 IDEA 报错,只需要设置 @Autowired(required=false) 即可,如下图所示:


9bab56d6eada98bb3a195b94c698e911.png

(其中 userMapper2 对象就不报错了)

  • @Autowired(required=true):表示当使用 @Autowired 注解的时候,该 bean 必须存在,否则注入失败,默认值。

  • @Autowired(required=false):表示忽略当前要注入的 bean,如果有直接注入,没有则跳过,不会报错。

@Autowired 默认值的实现源码:


738eb9c15f31fe2fc8bfeafab465dc14.png

解决方案4:使用@Resource注解

使用 @Resource 注解替换 @Autowired 注解也可以避免报错,它们的对比效果如下:


f4448f1a29ad07eee5478b363c543125.png

@Resource 注解和 @Autowired 注解以当前的场景来说,它们的主要区别是 @Resource 是 Java 自身提供的注解,而 @Autowired 是 Spring 提供的注解,@Autowired 默认值为 required=true,所以必须要一个非 NULL 的对象,当 IDEA 检测不到对象为 NULL 时就会报错,而 @Resource 并没有这项要求。

小结

使用 @Autowired 注解导入 Mapper 对象报错的原因,是因为 @Autowired 默认情况下,需要注入一个非 NULL 的对象,而被 @Mapper 修饰的类为 MyBatis 的注解,IDEA 并不能很好的识别其为非 NULL 对象,因此就会报错。当然,它的解决方案也有很多,推荐使用 @Resource 替代 @Autowired 注解的方式来解决此问题。


面试突击课

磊哥一直在做的事,为了让大家找到更好的工作,所以有着13 年工作经验的我,开发了一门《Java 面试突击课》,整个课程以包含 15 万字的图文课件 + 3000 多分钟的视频课(支持永久观看),带领大家一起高效、系统的复习 Java 面试知识。

整个课程从 Java 基础到微服务 Spring Cloud 应用尽有,包含以下 14 个大的模块:

9fe30b39cbb722f1423df429f90bb4d8.png

收费只要 1200 元,带你高效的搞定面试问题,学完之后可以搞定目前市面上的绝大部分面试,锁定高薪 Offer。 

报名只需加我微信:GG_Stone【备注:面试课】

81a5137fea00c32df4817aa29f800f59.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/987447.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第一次去新加坡Token2049?这份行前攻略请收好

TOKEN2049是行业领先的Web3盛会,往届的Token2049,知名项目的创始人主会场遍地跑,了解亚洲区块链前沿,BD更多新项目,寻找潜在投资机会,Token2049不会让你失望。 Moonbeam中文社区今年也会出席Token2049系列活…

安科瑞智能微型断路器在某银行网点的设计与应用

安科瑞 崔丽洁 【摘要】:随着人工智能、移动互联等现代信息技术和通信技术在电力行业的应用,实现电力系统各个环节人机交互、万物互联,打造状态全方面感知、信息合理处理、应用便捷灵活的泛在电力物联网已成为必然趋势。本文主要对智能微型断…

C++ 围炉札记

文章目录 内存检测ProtoBufCMake、vscode、clion、Qt右值1、临时变量右值引用2、右值引用本质 函数返回std::functionPOD(Plain Old Data)thread_localnew / delete1、定位new运算符 可变参数模板typename和class1、C模板类头文件和实现文件分离的方法2、…

BT8959T2/5 LCD 驱动

1 Preface/Foreword LCD驱动路径:app/gui/lcd/ SDK默认的LCD驱动:lcd_gc9c01.c 2 数据结构 3 代码分析

高忆管理:科创板中签率?

科创板于当时已经成为出资者追捧的板块,许多新股都在科创板上市,那么科创板新股的中签率是高仍是低呢?是取决于哪些要素形成的呢?下面,本文将从多个角度剖析这个问题。 一、科创板中签率是什么? ​ 科创…

LeetCode 1126.查询活跃业务

数据准备 Create table If Not Exists Events (business_id int, event_type varchar(10), occurences int); Truncate table Events; insert into Events (business_id, event_type, occurences) values (1, reviews, 7); insert into Events (business_id, event_type, occu…

三段视频怎么合并在一起?三种方法教你快速合并

合并视频可以节省存储空间。如果我们有多个视频文件,每个文件可能需要一定的存储空间。但是,如果将它们合并到一个文件中,就可以节省存储空间并更轻松地管理文件。此外合并视频还使其更易于共享。如果需要将视频发送给其他人,您只…

Python实操:内存管理与优化策略

在 Python 开发过程中,合理有效地管理和优化内存使用是提高程序性能和效率的关键。本文将深入探讨 Python 中的内存管理机制,并分享一些实用的优化策略和具体操作步骤,帮助您更好地利用资源、减少内存占用并提升代码执行速度。 一、了解 Pyth…

【Python】【Fintech】解决用pandas_datareader从yahoo下载股票数据时出错

【背景】 要做一个预测投资组合portfolio未来收益的python脚本,类似的功能需要从数据源获取相关指数和股票的数据,一直以来都是用pandas_datareader从yahoo上面拿,但是后来忽然发现不能用了,这篇就说明一下遇到此问题的walk around. 【分析】 由于数据源是yahoo那边的,…

基于VUE3+Layui从头搭建通用后台管理系统(前端篇)十二:通用详情组件封装实现

一、本章内容 本章实现通用详情组件,自动识别实体配置信息,并自动生成对应组件,填充组件数据,并完成数据自动加载等过程。 1. 详细课程地址: 待发布 2. 源码下载地址: 待发布 二、界面预览 三、开发视频 3.1 B站视频地址࿱

Vue 前端项目使用alibaba矢量库svg图标

Vue 前端项目使用alibaba矢量库svg图标 这里主要是记录 vue项目中使用阿里矢量库图标的操作流程,方便以后查阅!!! 一、简介 iconfont 是由阿里巴巴体验团队打造的,一款设计和前端开发的便捷工具.拥有着很强大且图标内…

手把手教你在视频剪辑及数字人训练中花式抠图

本文为阿里云智能媒体服务IMS「云端智能剪辑」实践指南第三期,讲述围绕 视频剪辑及数字人训练中的抠图需求,如何运用 绿幕抠图、实景抠图能力,实现高效、便捷的视频制作及合成体验。 昱尘|作者 悬刃|算法支持 “你这背…

达梦数据库awr报告收集

1、找出快照点snap_id与时间的对应关系 SYS.WRM$_SNAPSHOT表中记录了快照点snap_id与时间的对应关系 例如如下语句可以得出2023-09-04这一天各个时间点对应的快照点snap_id select snap_id,end_interval_time from SYS.WRM$_SNAPSHOT where end_interval_time between to…

亚马逊鲲鹏系统多渠道引流功能快速增加你的listing流量

如果亚马逊Listing没有流量,那么亚马逊产品排名也会在很靠后的位置,从而就会导致吸引不到客户点击进行下单购买,因此引流就很重要了,普通的引流方法很难达到效果,并且还会花费大量的时间,那么我们可以用亚马…

Elasticsearch实现词云效果Demo

文章目录 前言前期准备springbootElasticsearch依赖 思路准备数据查询数据处理文本样式处理 具体实施数据准备创建索引数据存储进行查询 踩坑记录聚合查询不生效问题 demo地址总结 前言 最近项目中使用Elasticsearch在做快速查询的功能,然后就想到了之前的一个项目…

航空航天行业的MES系统解决方案

航空航天行业的制造执行系统(MES)解决方案是为了满足这个高度复杂、高度规定、高度技术要求的行业而设计的。MES系统在航空航天制造中发挥着关键的作用,帮助企业提高生产效率、降低成本、确保质量合规性,并实现生产过程的可视化和…

免费小程序商城搭建之b2b2c o2o 多商家入驻商城 直播带货商城 电子商务b2b2c o2o 多商家入驻商城 直播带货商城 电子商务

1. 涉及平台 平台管理、商家端(PC端、手机端)、买家平台(H5/公众号、小程序、APP端(IOS/Android)、微服务平台(业务服务) 2. 核心架构 Spring Cloud、Spring Boot、Mybatis、Redis 3. 前端框架…

基于SpringBoot+Vue实现的前后端分离的外卖点餐系统源代码+数据库

该项目是一个前后端分离的外卖点餐系统,项目后端采用SpringBoot开发。 完整代码下载地址:基于SpringBootVue实现的前后端分离的外卖点餐系统源代码数据库 功能模块 基础数据模块 分类管理员工管理套餐管理 点餐业务模块 店铺营业状态微信登录缓存商品…

数字孪生背后:谁在构建真实的数字世界?

如果说过去人们对于数字孪生的定位仅仅是真实世界的数字映像,那么如今,在映像之外,于众多的产业之中,它也更在通过更加复杂的设计和 技术成为现实世界的新数字调控器。 在这艘向前行进的航船上,改变的不仅是前方更加…

【录用案例】CCF-C类,1/2区SCIEI,3个月14天录用,30天见刊,11天检索

计算机科学类SCI&EI 【期刊简介】IF:5.5-6.0,JCR1/2区,中科院2区 【检索情况】SCI&EI 双检(CCF-C类) 【征稿领域】边缘计算、算法与机器学习的结合研究 录用案例:3个月14天录用,录用…