@Autowired报错原因分析和4种解决方案!

摘要:
@Autowired:指示忽略要注入的bean。如果有直接注入,如果没有,则跳过,并且不会报告错误。总结@Autowire注释用于导入Mapper对象并报告错误的原因。因为@Autowire默认需要注入非NULL对象,而@Mapper修改的类是MyBatis的注释。IDEA无法很好地将其识别为非NULL对象,因此它会报告错误。当然,有很多解决方案。建议使用@Resource而不是@Autowired注释来解决此问题。

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

报错原因分析

报错的原因首先是因为 IDEA 强大的报警机制,@Autowired 为 Spring 的注解,含义是将某类动态的注入到当前类中,如下图所示:
image.png
@Autowired 默认是根据 type 进行注入,并且注入时要求(注入)对象不能为 NULL,默认值如下图所示:
image.png
IDEA 报错的原因是:@Autowired 为 Spring 的注解,而注入的 Mapper 对象使用的又是 @Mapper 的注解,然而 @Mapper 又为 MyBaits 的注解,IDEA 能很好的兼容并识别 Spring 的注解,但不能很好的识别 MyBatis 的注解,因此在使用 @Autowired 注解时,IDEA 并不能检测到 @Mapper 注解的对象不为 NULL,因此就会报错。
image.png

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

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

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

1.打开 IDEA,找到参数设置选项 “Preferences...” ,如下图所示:
image.png
2.依次选择 “Editor” -> “Inspections” -> “Spring” -> “Spring Core” -> “Code” -> “Autowiring for bean class” 将 “Error” 级别修改成 “Waring” 级别,如下图所示:
image.png
设置完成之后点击确认,查看之前报错的 Mapper 类,此时展示效果如下:
image.png
报错信息消失了。

解决方案2:添加Spring注解

在 Mapper 的类上添加 Spring 的注解,也可以解决 IDEA 报错的问题,如 @Repository 或 @Component 这类注解,如下图所示:
image.png
或使用 @Repository 注解,如下图所示:
image.png
查看之前的报错信息:
image.png
报错消失了。

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

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

  • @Autowired(required=true):表示当使用 @Autowired 注解的时候,该 bean 必须存在,否则注入失败,默认值。
  • @Autowired(required=false):表示忽略当前要注入的 bean,如果有直接注入,没有则跳过,不会报错。

@Autowired 默认值的实现源码:
image.png

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

使用 @Resource 注解替换 @Autowired 注解也可以避免报错,它们的对比效果如下:
image.png
@Resource 注解和 @Autowired 注解以当前的场景来说,它们的主要区别是 @Resource 是 Java 自身提供的注解,而 @Autowired 是 Spring 提供的注解,@Autowired 默认值为 required=true,所以必须要一个非 NULL 的对象,当 IDEA 检测不到对象为 NULL 时就会报错,而 @Resource 并没有这项要求。

总结

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

更多 Spring 干货,关注公众号「Java中文社群」,实时获取。

免责声明:文章转载自《@Autowired报错原因分析和4种解决方案!》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇如何掌握C#的核心技术交易系统开发小结下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Java代码格式化规范实践总结

目标说明 统一良好的代码格式规范可以有效提升开发团队之间的「协作效率」,如果不同的开发团队或者开发人员采用不同的代码格式规范,那么每次Format代码都会导致大量的变化,在Code Review及Merge代码时会带来很多的干扰项。因此制定本代码规范希望达成以下目标: 统一Java代码格式规范,确保团队成员间「代码风格一致」; 保证Format代码时不会...

idea的一些快捷方式

关于IDEA工具的快捷键及一些简单的设置: 1.字体设置 file --->settings ---> 输入font  --->  设置字体样式以及字号大小。 2.快速生成main方法 psvm或者main 3.快速生成System.out.println() sout 4.注意:IDEA是自动保存的,不需要ctrl+s; 5.删除一行:...

IDEA springboot+maven+mybatis pojo代码自动生成

首先创建GeneratorMapper.xml文件,让着src目录下, <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0...

Webstorm/IntelliJ Idea 过期破解方法

一、Webstorm过期破解方法  如下图,WebStorm过期了,每次都是用30分钟,重新打开。 解决方法: 第一步:先删除C:Users本机用户名.WebStorm2016.3config文件中eval文件。 第二步:打开webstrom 如图,填写许可证激活码:http://idea.imsxm.com/,点击Activate完成。 如图 如果此...

IDEA整合Mybatis+Struts2+Spring(一)--新建项目

1、IDEA新建Maven项目: (1)依次点击File->New->Project,弹出如下对话框:        (2)在弹出的New Project页面上,①选择Maven,② 勾选Create from artifactype,③选择maven-archetype-webapp,点击Next,如下图:          (3)Group...

使用IDEA将项目或指定模块打成JAR包

1、使用IDEA对整个项目进行打包 打包步骤如下: 1.1 File->Project Structure 1.2 Artifacts->JAR->From modules with dependencies 1.3 例如,可以将所有模块进行打包,JAR包的入口函数可以选择,也可以不选,打出的JAR包含依赖JAR 1.4 Build...