共计 1530 个字符,预计需要花费 4 分钟才能阅读完成。
上图的报错信息置信大部分程序员都遇到过, 奇怪的是尽管代码报错,但丝毫不影响程序的失常执行 ,也就是尽管编译器 IDEA 报错,但程序却能失常的执行,那这其中的起因又是为何?
报错起因剖析
报错的起因首先是因为 IDEA 弱小的报警机制,@Autowired 为 Spring 的注解,含意是将某类动静的注入到以后类中,如下图所示:
@Autowired 默认是依据 type 进行注入,并且注入时要求(注入)对象不能为 NULL,默认值如下图所示:
而 IDEA 报错的起因是:@Autowired 为 Spring 的注解,而注入的 Mapper 对象应用的又是 @Mapper 的注解,然而 @Mapper 又为 MyBaits 的注解,IDEA 能很好的兼容并辨认 Spring 的注解,但不能很好的辨认 MyBatis 的注解,因而在应用 @Autowired 注解时,IDEA 并不能检测到 @Mapper 注解的对象不为 NULL,因而就会报错。
这就是为什么应用 Spring 的注解 @Repository/@Component… 不报错,而应用 @Mapper 注解却会报错的根本原因,如下图所示:
解决方案 1:敞开报警机制
敞开 IDEA 注入报警机制,能够防止报错,实现步骤如下。
1. 关上 IDEA,找到参数设置选项“Preferences…”,如下图所示:
2. 顺次抉择“Editor”->“Inspections”->“Spring”->“Spring Core”->“Code”->“Autowiring for bean class”将“Error”级别批改成“Waring”级别,如下图所示:
设置实现之后点击确认,查看之前报错的 Mapper 类,此时展现成果如下:
报错信息隐没了。
解决方案 2:增加 Spring 注解
在 Mapper 的类上增加 Spring 的注解,也能够解决 IDEA 报错的问题,如 @Repository 或 @Component 这类注解,如下图所示:
或应用 @Repository 注解,如下图所示:
查看之前的报错信息:
报错隐没了。
解决方案 3:容许注入对象为 NULL
设置容许注入的 Mapper 对象为 NULL,也能够防止 IDEA 报错,只须要设置 @Autowired(required=false) 即可,如下图所示:
(其中 userMapper2 对象就不报错了)
- @Autowired(required=true):示意当应用 @Autowired 注解的时候,该 bean 必须存在,否则注入失败,默认值。
- @Autowired(required=false):示意疏忽以后要注入的 bean,如果有间接注入,没有则跳过,不会报错。
@Autowired 默认值的实现源码:
解决方案 4:应用 @Resource 注解
应用 @Resource 注解替换 @Autowired 注解也能够防止报错,它们的比照成果如下:
@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 中文社群」,实时获取。