@RequiredArgsConstructor(onConstructor = @__(@Autowired)) Intellij IDEA如何去掉@Autowired 注入警告的方法
问题
在Service层注入Mybatis的Mapper我们通常会使用@Autowired
自动注入
1 2 |
|
但是这样Intellij IDEA会显示红色告警,提示不能自动注入。
当我们在Controller层注入Service时我们也经常直接在Filed上使用@Autowired
注解,这时候不显示红色警告,但是也显示Field injection is not recommended
的建议
原因
第一种情况是因为IDEA可以识别并理解Spring的上下文。然而Mapper接口是Mybatis的,IDEA理解不了。所以会出现红色告警。
而第二种原因是因为官方不推荐使用Filed进行注解,而推荐使用构造器或Setter方法进行注解,像下面两种写法就不会出现警告。
1 2 3 4 5 |
|
or
1 2 3 4 5 |
|
问题是什么
Field注入看起来非常好,够简洁,代码通俗易懂。你的类可以专注于业务而不被依赖注入所污染。你只需要把@Autowired扔到变量之上就好了,不需要特殊的构造器或者set方法,依赖注入容器会提供你所需的依赖。但是Field注入会带来2个问题:
- 当注入的对象依赖其他对象,而被依赖的对象没被创建的话就会出现空指针异常。
- 这样的类没办法在容器之外被重用,也不能期望反射提供其所需的依赖。
详细原因大家可以去这篇文章查看:http://olivergierke.de/2013/11/why-field-injection-is-evil/
构造器注入 VS Setter注入
Setter应该被用来注入可变的依赖。当没有提供依赖时,这个类也应该能够运转。当实例化对象后,这些依赖也能随时改变。其实也视情况而变,有时,一个不变的对象是理想状态。有时,最好是能在运行期间改变对象的属性。
构造器注入对象需要依赖的对象初始化后才能正常运转,通过构造器提供这些依赖就能保证对象初始化后就能被使用。使用构造器注入的一个可能的影响就是循环依赖。
怎么解决
我们可以使用Lombok提供的注解 @RequiredArgsConstructor
来解决这两个问题(Lombok这个大家项目都会使用吧)
1 2 3 4 5 6 7 |
|
这里必须使用final修饰符来修饰注入的Service或Mapper首先我们看看编译后的类是什么样
编译完成后变成了使用构造器进行注入
认识@RequiredArgsConstructor
Lombok官方给出的解释是: Generates constructor that takes one argument per final / non-null field. 所以它会为final和nonnull的属性作为参数产生一个构造函数。
而上面我们讲了Spring推荐使用Setter或构造器注入,那么@RequiredArgsConstructor刚好可以完成这件事,而且还简化了你的代码
@RequiredArgsConstructor(onConstructor = @__(@Autowired)) Intellij IDEA如何去掉@Autowired 注入警告的方法相关推荐
- @RequiredArgsConstructor(onConstructor = @__(@Autowired))报错原因
有几个原因: 1. 没装lombok 如果你是idea,那就不需要下载lombok,只需要在依赖中添加lombok依赖就好,idea自动装了lombok. 2. 版本错误 有的版本是_一个下划线,有的 ...
- @autowired注入mapper_Intellij IDEA中Mybatis Mapper自动注入警告的6种解决方案
相信使用Mybaits的小伙伴们一定会经常编写类似如下的代码: 可以看到 userMapper 下有个红色警告.虽然代码本身并没有问题,能正常运行,但有个警告总归有点恶心.本文分析原因,并列出解决该警 ...
- @autowired注解注入为null_Intellij IDEA中Mybatis Mapper自动注入警告的6种解决方案
相信使用Mybaits的小伙伴们一定会经常编写类似如下的代码: 可以看到 userMapper 下有个红色警告.虽然代码本身并没有问题,能正常运行,但有个警告总归有点恶心.本文分析原因,并列出解决该警 ...
- Intellij IDEA中Mybatis Mapper自动注入警告的6种解决方案
相信使用Mybaits的小伙伴们一定会经常编写类似如下的代码: 可以看到 userMapper 下有个红色警告.虽然代码本身并没有问题,能正常运行,但有个警告总归有点恶心.本文分析原因,并列出解决该警 ...
- 去掉@Autowired注解下面的黄色警示波浪线
去掉 @Autowired注解下面的波浪线 具体操作如下图所示即可: 说明: 1.好多文章上将 Error stripe mark的复选框也取消勾选,我觉得只取消Effects的复选框就能达到取消黄色 ...
- IntelliJ IDEA 学习笔记 - @Autowired 报红波浪线
IntelliJ IDEA 学习笔记 - @Autowired 报红波浪线 情况一: 属性注入 情况二: 构造注入 最终效果 自欺欺人解决方案 方案1. 换 `@Resource` (这个我爱用) 方 ...
- nginx php 后缀名,nginx去掉php后缀名的方法
nginx去掉php后缀名的方法 发布时间:2020-09-30 14:36:49 来源:亿速云 阅读:68 作者:小新 小编给大家分享一下nginx去掉php后缀名的方法,相信大部分人都还不怎么了解 ...
- Intellij+maven:jar包冲突的解决方法(Hbase和Guava的冲突)
Intellij+maven:jar包冲突的解决方法(Hbase和Guava的冲突) 参考文章: (1)Intellij+maven:jar包冲突的解决方法(Hbase和Guava的冲突) (2)ht ...
- SpringBoot集成Quartz(解决@Autowired空指针Null问题即依赖注入的属性为null)
SpringBoot集成Quartz(解决@Autowired空指针Null问题即依赖注入的属性为null) 参考文章: (1)SpringBoot集成Quartz(解决@Autowired空指针Nu ...
- 去掉linux开关机图片,在Deepin Linux系统下去掉NVIDIA开机Logo的方法
要实现在deepin Linux或其他Linux系统下去掉NVIDIA开机Logo非常的简单,只需要两步就可以了,可以运用命令操作,也可手动操作.安装NVIDIA请参考在deepin系统中安装英伟达N ...
最新文章
- 【解题报告系列】超高质量题单 + 题解(ACM / OI)超高质量题解
- 如何利用计算机计算天数,计算机如何计算两个日期之间的天数
- MPLS QoS的实现——微云专线
- excel随机数_如何使用excel高效背GRE单词?
- ML之多分类预测之PLiR:使用PLiR实现对六类label数据集进行多分类
- puppet结构图一例
- UpdatePanel中用后台调用Javascript
- 遗传算法求最短路径(旅行商问题)python实现
- 今日头条的,顶部导航,实现分析
- nginx配置文件语法高亮的Sublime Text扩展
- LeetCode--75.颜色分类(三路快排,计数排序)
- PAT 1012 数字分类 (20)
- SCOM2012功能测试(18)—对象发现(替代)
- Unity shader实现水效果(折射,反射,波浪,1.菲尼尔,深度颜色)
- CS224N笔记——词向量表示
- 中的draw函数_哪一个热图函数更快?
- 3打开db文件_sqlite库学习(3)为什么sqlite3_open会失败
- 【最优估计学习笔记】概率密度函数
- 3 linux禁用ssl_linux – Poodle:在服务器上禁用SSL V3真的是一个解决方案吗?
- kali下一句话升级metasploit
热门文章
- [Canvas]空战游戏进阶 增加己方子弹管理类
- Codeforces Round #102 (Div. 1) D Help Shrek and Donkey 2
- 出现”/var/lib/mysql/mysql.sock“不存在的解决方法
- Linux嵌入式学习-ds18b20驱动
- hdu 2196(求树上每个节点到树上其他节点的最远距离)
- [转载]用户(User)和用户组(Grou…
- Flutter 移动端屏幕适配方案和制作
- K3 WISE 开发插件《SQL语句WHERE查询-范围查询/模糊查询》
- java并发编程(四) 线程池 任务执行、终止源码分析
- 用maven编译spark2.1.0