Intellij IDEA如何去掉@Autowired 注入警告的方法
作者:飘渺Jam 发布时间:2023-02-13 04:34:49
问题
在Service层注入Mybatis的Mapper我们通常会使用@Autowired
自动注入
@Autowired
private ProductMapper productMapper;
但是这样Intellij IDEA会显示红色告警,提示不能自动注入。
当我们在Controller层注入Service时我们也经常直接在Filed上使用@Autowired
注解,这时候不显示红色警告,但是也显示Field injection is not recommended
的建议
原因
第一种情况是因为IDEA可以识别并理解Spring的上下文。然而Mapper接口是Mybatis的,IDEA理解不了。所以会出现红色告警。
而第二种原因是因为官方不推荐使用Filed进行注解,而推荐使用构造器或Setter方法进行注解,像下面两种写法就不会出现警告。
private final ProductService productService;
@Autowired
public ProductController(ProductService productService) {
this.productService = productService;
}
or
private ProductService productService;
@Autowired
public void setProductService(ProductService productService) {
this.productService = productService;
}
问题是什么
Field注入看起来非常好,够简洁,代码通俗易懂。你的类可以专注于业务而不被依赖注入所污染。你只需要把@Autowired扔到变量之上就好了,不需要特殊的构造器或者set方法,依赖注入容器会提供你所需的依赖。但是Field注入会带来2个问题:
当注入的对象依赖其他对象,而被依赖的对象没被创建的话就会出现空指针异常。
这样的类没办法在容器之外被重用,也不能期望反射提供其所需的依赖。
详细原因大家可以去这篇文章查看:http://olivergierke.de/2013/11/why-field-injection-is-evil/
构造器注入 VS Setter注入
Setter应该被用来注入可变的依赖。当没有提供依赖时,这个类也应该能够运转。当实例化对象后,这些依赖也能随时改变。其实也视情况而变,有时,一个不变的对象是理想状态。有时,最好是能在运行期间改变对象的属性。
构造器注入对象需要依赖的对象初始化后才能正常运转,通过构造器提供这些依赖就能保证对象初始化后就能被使用。使用构造器注入的一个可能的影响就是循环依赖。
怎么解决
我们可以使用Lombok提供的注解 @RequiredArgsConstructor
来解决这两个问题(Lombok这个大家项目都会使用吧)
@Service
@Log4j2
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class ProductServiceImpl implements ProductService {
private final ProductMapper productMapper;
...
}
这里必须使用final修饰符来修饰注入的Service或Mapper首先我们看看编译后的类是什么样
编译完成后变成了使用构造器进行注入
认识@RequiredArgsConstructor
Lombok官方给出的解释是: Generates constructor that takes one argument per final / non-null field. 所以它会为final和nonnull的属性作为参数产生一个构造函数。
而上面我们讲了Spring推荐使用Setter或构造器注入,那么@RequiredArgsConstructor刚好可以完成这件事,而且还简化了你的代码,何乐而不为是不是?
来源:https://blog.csdn.net/jianzhang11/article/details/105283642
猜你喜欢
- 本文实例讲述了Java实现读取及生成Excel文件的方法。分享给大家供大家参考,具体如下:一、读取Excel文件需要先下载poi-3.0.1
- 本文介绍了详解Android中PopupWindow在7.0后适配的解决,分享给大家,具体如下:这里主要记录一次踩坑的经历。需求:如上图左侧
- 废话目前流行的前后端分离让Java程序员可以更加专注的做好后台业务逻辑的功能实现,提供如返回Json格式的数据接口就可以。SpringBoo
- package org.itat.stax;import java.io.IOException;import java.io.InputS
- 代码如下:using System; using System.Collections.Generic; using S
- 本文主要关注如何使用mybatis/mybatis plus连接SQL Server数据库,因此将省略其他项目配置、代码。框架选择应用框架:
- (一) collection和collections这两者均位于java.util包下,不同的是:collection是一个集合接口,有Li
- 涉及知识点在本示例中,从数据绑定,到数据展示,涉及知识点如下所示:DataGrid,要WPF提供的进行二维数据展示在列表控件,默认功能非常简
- 一、什么是内存泄露?Java使用有向图机制,通过GC自动检查内存中的对象(什么时候检查由虚拟机决定),如果GC发现一个或一组对象为不可到达状
- 这是Hadoop学习全程记录第1篇,在这篇里我将介绍一下如何在Linux下安装Hadoop1.x。先说明一下我的开发环境:虚拟机:VMwar
- 封面图下个季度的目标是把前端监控相关的内容梳理出来,梳理出来之后可能会在公司内部做个分享~Flutter应用程序既括代码也包括一些其他的资产
- 我在5月份的时候就申请了洞态IAST企业版内测,算是比较早的一批用户了。聊聊几个我比较在意的问题,比如API接口覆盖率、第三方开源组件检测以
- 工厂方法模式(Factory Method):定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。工
- 关于Context我们首先应该知道:(1)它描述的是一个应用程序环境的信息,即上下文。(2)该类是一个抽象(abstract class)类
- 1.其中包括下载JDBC FRO Microsft SQL_Server2000的驱动程序(在微软官方网站下的,是sp3版的,这里就不写具体
- 希尔排序是插入排序的一种,又称"缩小增量排序”,是插入排序算法的一种更高效的改进版本。希尔排序原理1.选定一个增长量h,按照增长量
- 一、什么是ASMASM是一个java字节码操纵框架,它能被用来动态生成类或者增强既有类的功能。ASM 可以直接产生二进制 class 文件,
- try &
- MyBatis-Generator自动生成映射文件生成的方式一共有三种1、使用cmd命令方式生成首先在generator.xml中指定数据库
- 布局中EditText在android布局中经常用到,对EditText中输入的内容也经常需要进行限制,我们可以通过TextWatcher去