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


猜你喜欢
- ClasspathResource路径问题前言在项目中工程以springboot jar形式发布,跟之前容器比少了一个解压目录,这个过程中出
- 开发环境win10Android Studio效果用于多级菜单展示,或选择。如 每个省,市,县;如 树木的病虫害;关键代码 @overrid
- 概述一般我们在向文档添加水印时,会分为直接添加文字水印和加载图片添加图片水印两种情况。常见的,在添加文字水印时会多以声明文档版权、权威性的文
- 概览Android Studio 4.1 目前已经发布,该版本共修复了2370 个 bug 以及 275 个 issue,主要包含如下新增功
- 目前 Android 已经不推荐使用下列方式创建 Notification实例:Notification notification = ne
- 背景我们项目一开始的所有提示都是中文,后来要做国际化。发现项目中的带双引号的中文居然有 2.3 w 多条!!!简直让人欲
- 最近研究C#相关的ORC技术,图像识别一般C和C++这种底层语言做的比较多,C#主要是依托一些封装好的组件进行调用,这里介绍三种身份证识别的
- 近日工作任务较轻,有空学习学习技术,遂来研究如果实现读写分离。这里用博客记录下过程,一方面可备日后查看,同时也能分享给大家(网上的资料真的大
- Step1: 安装JDK并配置环境变量;Step2: 安装Gradle进入点击打开链接官网首页点击install gra
- 1.Object类的equals()方法:比较两个对象是否是同一个对象,equals() 方法比较两个对象,是判断两个对象引用指向的是同一个
- mybatis在持久层框架中还是比较火的,一般项目都是基于ssm。虽然mybatis可以直接在xml中通过SQL语句操作数据库,很是灵活。但
- 一、 结构:值类型,存储在堆栈中,位于计算机的内存逻辑区域中 类 &n
- 昨天直接在机器上配置了Maven环境,今天顺便把Eclipse等IDE环境配置好。安装IDE Plugins的方法有很多。其一:在线安装,通
- 本文实例讲述了Android开发之ListView列表刷新和加载更多实现方法。分享给大家供大家参考。具体如下:上下拉实现刷新和加载更多的Li
- 一、项目概述之前有不少粉丝私信我说,能不能用Android原生的语言开发一款在手机上运行的游戏呢?说实话,使用java语言直接开发游戏这个需
- 引言综合应用Java的GUI编程和网络编程,实现一个能够支持多组用户同时使用的聊天室软件。该聊天室具有比较友好的GUI界面,并使用C/S模式
- 今日遇到一个问题:springboot需要获取到一个自定义名称文件夹下的静态资源(图片等),并且文件夹的路径不在classPath下面,而是
- Object类型是所有类型的基类,其下面有ValueType类型。什么结构啊,枚举啊,都继承ValueType,这些都是值类型。其他的什么类
- class文件中的特殊字符串首先说明一下, 所谓的特殊字符串出现在class文件中的常量池中,本着循序渐进和减少跨度的原则, 首先把clas
- 前言:数据抽象是一种仅向用户显示基本细节的属性。不向用户显示琐碎或非必需的单元。例如:汽车被视为汽车而不是其单个组件。数据抽象也可以定义为仅