@autowired注解注入为null_Intellij IDEA中Mybatis Mapper自动注入警告的6种解决方案

相信使用Mybaits的小伙伴们一定会经常编写类似如下的代码:

47cc4888b1093bc37003a23110b5fcfb.png

可以看到 userMapper 下有个红色警告。虽然代码本身并没有问题,能正常运行,但有个警告总归有点恶心。本文分析原因,并列出解决该警告的几种方案。

原因

众所周知,IDEA是非常智能的,它可以理解Spring的上下文。然而 UserMapper 这个接口是Mybatis的,IDEA理解不了。

@Autowired 注解,默认情况下要求依赖对象(也就是 userMapper )必须存在。而IDEA认为这个对象的实例/代理是个null,所以就友好地给个提示

解决方案

方法1:为 @Autowired 注解设置required = false

使用 @Autowired 注解时,若希望允许null值,可设置required = false,像这样:

@Autowired(required = false) private UserMapper userMapper;

这样就不会有警告了。原因很好理解:IDEA认为userMapper是个null,给了警告;加上required = false后,使用 @Autowired 注解不再去校验userMapper是否存在了。也就不会有警告了。

总结:这种方式有点蛋疼。一个庞大的既有项目,可能到处都在引用Mapper,总不能到处都补上 required = false 吧……而且对于新手/新员工,很难一眼看懂加required = false属性只是为了解决IDEA的警告。

方法2:用 @Resource 替换 @Autowired

像这样:

@Resource private UserMapper userMapper;

这样也不会再有讨厌的警告。如果你对原因感兴趣,不妨了解一下《@Autowired 与@Resource的区别》

总结:这种方式挺赞,但如果一个项目已经大量使用@Autowired,然后为了个警告到处改成@Resource,也有点蛋疼。

方法3:在Mapper接口上加上@Repository注解

像这样:

@Repository public interface UserMapper extends Mapper<User> { }

这样也能让你的

@Autowired private UserMapper userMapper;

不再报错。

当然,如果你用@Component替换@Repository也是可以的。原理大致:IDEA不是认为 userMapper 是个null嘛…加个@Repository注解骗一下IDEA就OK了……

总结:这种方式比较赞,改动小,也简单,我比较喜欢。

方法4:用Lombok

像这样:

@Service @RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class TestService { private final UserMapper userMapper; ... }

Lombok生成的代码是这样的:

@Service public class TestService { private final UserMapper userMapper; @Autowired public TestService(final UserMapper userMapper) { this.userMapper = userMapper; } ... }

但如果自己手写成Lombok生成的代码,IDEA依然会给你报警告 。我猜,应该是IDEA的Lombok插件把IDEA搞懵逼了…所以不提示了…

总结这是我目前最喜欢的方式。原因有2:

  • Spring官方并不建议直接在类的field上使用@Autowired注解,原因详见:《Why field injection is evil》 ,用本方法可将field注入编程构造方法注入,Spring是比较推荐的。
  • 体现了Lombok的优势,简化了你的代码。而且你也不用在每个field上都加上@Autowired注解了。

不过这种方式也有缺点:那就是如果你类之间的依赖关系比较复杂,特别是存在循环依赖(A引用B,B引用A,或者间接的循环引用)时,应用将会启动不起来……这其实是构造方法注入方式的缺点

方法5:把IDEA的警告关闭掉

个人没试过,也没有动力去试。没有提示的IDEA是没有灵魂的,我从来不去修改IDEA的任何警告设置。

方法6:安装mybatis plugin

安装mybatis plugin即可解决该问题。

总结

以上是解决问题的6种方法。问题本身其实比较简单,但其实隐藏的知识点其实挺多的,例如:

  • @Autowired和@Resource有什么区别
  • 为什么Spring不建议使用field方式注入
  • @Repository、@Componnt、@Controller、@Service有什么区别

总之,硬货有时候就隐藏在很low的问题之下,哈哈哈。

参考文档

  • 剔除Intellij中Mybatis的Mapper自动注入警告
  • idea mybatis 注入 mapper 提示错误

作者:大目

链接:http://www.imooc.com/article/287865

来源:慕课网

本文原创发布于慕课网 ,转载请注明出处,谢谢合作

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

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

相关文章

五 Python之socket网络编程

<1>socket概念 socket通常也称作"套接字"&#xff0c;用于描述IP地址和端口&#xff0c;是一个通信链的句柄&#xff0c;应用程序通常通过"套接字"向网络发出请求或者应答网络请求。ocket本质上就是在2台网络互通的电脑之间&#xff0c;架设一个通道…

致敬2016,拥抱2017

2016年5月10号加入现在的团队&#xff0c;到今天2016年12月31号&#xff0c;已经过去了接近8个月。这整个期间&#xff0c;我们团队都只有我一个前端工程师&#xff0c;我从刚开始的忐忑不安、压力极大&#xff0c;到现在基本上手&#xff0c;我们团队做的项目虽然不大&#xf…

你如何在java中获取线程堆_如何在Windows上获取未在控制台中运行的Java进程的线程和堆转储...

问题我有一个Java应用程序&#xff0c;我从控制台运行&#xff0c;然后控制台执行另一个Java进程。我想获得该子进程的线程/堆转储。在Unix上&#xff0c;我可以做akill -3 但是在Windows AFAIK上获取线程转储的唯一方法是在控制台中使用Ctrl-Break。但这只会让我转移父进程&am…

html ie乱码_Java 0基础入门(初识Html)

在学习Java之前&#xff0c;我们需要了解一定的前端知识。毕竟页面才是用户真正看到的&#xff0c;而且也是体现Java后端逻辑结果的地方。学习HTML后&#xff0c;能够制作界面美观大方的静态网站(更复杂的功能需要JavaScript脚本一起来实现)。HTML制作的网页。所需要的Html开发…

常用自动化框架简单的分析与介绍

目前常用的可用于APP自动化测试的框架有以下几个&#xff1a; 1、Monkey是Android SDK自带的测试工具&#xff0c;在测试过程中会向系统发送伪随机的用户事件流&#xff0c;如按键输入、触摸屏输入、手势输入等)&#xff0c;实现对正在开发的应用程序进行压力测试&#xff0c;也…

linux一步一脚印---more、less、head、tail

一、more 文件内容或输出查看命令more 是我们最常用的工具之一&#xff0c;最常用的就是显示输出的内容&#xff0c;然后根据窗口的大小进行分页显示&#xff0c;然后还能提示文件的百分比&#xff1b; [rootlocalhost ~]# more /etc/profile 1、more 的语法、参数和命令&#…

单片机检测stc没反应_我为什么不用STC单片机

写在2019.10.27这属于自己打自己脸&#xff0c;不过&#xff0c;我突然想试试 STC15W108.理由可能有点操蛋&#xff0c;因为STM8S没有 DFN8这样 3x3的封装&#xff0c;而PIC的仿真器太贵。我最后感兴趣的一个STC型号是 STC15F的8脚系列&#xff0c;那是在2010年&#xff0c;然而…

commons-pool

commons-pool组件是使用对象池时都要用到的。他的作用主要是管理对象池&#xff0c; 当我们要用这个组件时&#xff08;比如redis要用到时&#xff09;&#xff0c;只需要实现它的部分接口&#xff0c;比如PooledObjectFactory接口&#xff0c;实现它的创建对象&#xff0c;销毁…

JAVA中CyclLink怎么用_Java多线程基本使用一

1 多线程--初步【1进程比如&#xff1a;QQ、迅雷、360、飞秋...2线程的概念3线程的意义&#xff1a;4.Java程序的运行原理代码是运行在线程中的&#xff0c;如果一个进程没有线程&#xff0c;那么进程就结束了&#xff0c;也就是说一个进程至少要有一个线程当开启一个Java…

指针分析

int *a; int b 4; a &b; //a:b的地址 //*a 取b地址的值&#xff0c;为4 //&a为指针变量的地址 //*(&a)为指针变量储存的地址 即为a int **b &a; //b为指针变量a的地址 //*b为指针变量a所储存的地址 //改变*b(指针变量所储存的地址)即改变了*b的值转载于:http…

live server插件怎么用_分享几个我日常使用的VS Code插件

在这篇文章中&#xff0c;我想介绍一下自己日常使用中最喜欢的Visual Studio Code扩展。大多数时候&#xff0c;我用VS Code编写的是JavaScript应用程序(标准JavaScript、React、Angular、NodeJS……各式各样)。Bracket Pair Colorizer 2这个扩展很不错&#xff0c;可以帮助我搞…

Xtrabackup数据全备份与快速搭建从服务器

Percona Xtrabackup可以说是一个完美的数据备份工具。特别是当数据库的容量达到了一定数量级的时候且存在单表达到几十G的数据量&#xff0c; 很难容忍一些逻辑备份的漫长时间。如单个数据库约200G&#xff0c;单表最大为120G&#xff0c;mysqldump逻辑备份的时间长达20多小时。…

简单的java方法_Java简单实用方法一

整理以前的笔记&#xff0c;在学习Java时候,经常会用到一些方法。虽然简单但是经常使用。因此做成笔记&#xff0c;方便以后查阅这篇博文先说明构造和使用这些方法。1&#xff0c;判断String类型数据是否为空String类型的数据为空&#xff0c;主要为等于null或”“那么只要判断…

Android应用程序开发

第一章 Android应用初体验 1.1应用基础 activity是Android SDK中Activity类的一个具体实例&#xff0c;负责管理用户与信息屏的交互。 应用的功能是通过编写一个个Activity子类来实现的。 布局定义了一系列用户界面对象以及它们显示在屏幕上的位置。组成布局的定义保存在XML文件…

phonegap

phonegap 框架详解 转自&#xff1a;http://www.cnblogs.com/hubcarl/p/4216844.html首先, 来看一下phonegap 初始化流程以及Native 与 JS 交互流程图。 说明&#xff1a;socket server模式下, phonegap.js 源码实现的采用1 毫秒执行一次XHR请求, 当Native JS 队列里面有JS语…

j2ee核心模式_Operator和Sidecar正在成为软件交付新模式

现如今的开发人员希望可以开发出具备弹性和可扩展的分布式系统。该系统受益于软件复用和开源模型创新&#xff0c;针对安全性问题能够轻易完成补丁更新并进行低风险的升级。该系统不可能通过带有各种嵌入式语言库的应用程序框架来实现。最近&#xff0c;一篇关于“多运行时微服…

微信JS-SDK选择相册或拍照并上传PHP实现

理解&#xff1a;微信上传接口是拍照&#xff0c;或者选择本地照片&#xff0c;上传到微信的服务器&#xff0c;获取到一个id&#xff0c;通过token与这个id获取到图片&#xff0c;保存到服务器即可。 效果 通过微信js接口&#xff0c;调用底层程序。 需要引入js文件&#xff0…

JMS-ActiveMQ学习-3 ActiveMQ与Spring集成

Spring下开发消息的发送和接收程序 点对点模式 一、创建生产者项目 1.创建maven项目 2.添加spring-jms、jms规范、activemq依赖 <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jms&…

看libevent所遇到的英语生词

libevent – an event notification library The libevent API &#xff08;libevent应用程序&#xff09;provides a mechanism&#xff08;机制&#xff09; to execute&#xff08;执行&#xff09; a callback function&#xff08;回调函数&#xff09; when a specific&a…