Intellij IDEA 如何去掉 @Autowired 注入警告

简介: 在Service层注入Mybatis的Mapper我们通常会使用@Autowired 自动注入

问题

在Service层注入Mybatis的Mapper我们通常会使用@Autowired 自动注入


@AutowiredprivateProductMapperproductMapper;


但是这样Intellij IDEA会显示红色告警,提示不能自动注入。


1.png


当我们在Controller层注入Service时我们也经常直接在Filed上使用@Autowired 注解,这时候不显示红色警告,但是也显示Field injection is not recommended 的建议


2.png


原因


第一种情况是因为IDEA可以识别并理解Spring的上下文。然而Mapper接口是Mybatis的,IDEA理解不了。所以会出现红色告警。


而第二种原因是因为官方不推荐使用Filed进行注解,而推荐使用构造器或Setter方法进行注解,像下面两种写法就不会出现警告。


privatefinalProductServiceproductService;
@AutowiredpublicProductController(ProductServiceproductService) {
this.productService=productService;
}


or


privateProductServiceproductService;
@AutowiredpublicvoidsetProductService(ProductServiceproductService) {
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))
publicclassProductServiceImplimplementsProductService {
privatefinalProductMapperproductMapper;
  ...
}


这里必须使用final修饰符来修饰注入的Service或Mapper首先我们看看编译后的类是什么样


3.png


编译完成后变成了使用构造器进行注入

目录
相关文章
IntelliJ IDEA - 复制文件全限定名快捷键
IntelliJ IDEA - 复制文件全限定名快捷键
770 0
IntelliJ IDEA - 复制文件全限定名快捷键
|
3月前
IntelliJ IDEA常用的快捷键
IntelliJ IDEA常用的快捷键
17 0
|
5月前
IntelliJ IDEA快捷键动图演示(八)
IntelliJ IDEA快捷键动图演示
|
5月前
|
安全
IntelliJ IDEA快捷键动图演示(七)
IntelliJ IDEA快捷键动图演示
|
5月前
IntelliJ IDEA快捷键动图演示(四)
IntelliJ IDEA快捷键动图演示
IntelliJ IDEA快捷键动图演示(四)
|
5月前
IntelliJ IDEA快捷键动图演示(二)
IntelliJ IDEA快捷键动图演示
IntelliJ IDEA - 跳到最近方法签名快捷键
IntelliJ IDEA - 跳到最近方法签名快捷键
608 0
Intellij IDEA快捷键与使用技巧
Intellij IDEA快捷键与使用技巧
170 0
|
机器学习/深度学习 安全 uml
IntelliJ IDEA For Mac 快捷键,速度收藏!
上期很多朋友留言说有没有 Mac 版的,现在来了,这篇是整理得比较全的了,建议大家收藏,日后必定有用!
164 0
|
传感器 安全 Java
IntelliJ IDEA 快捷键终极大全,速度收藏!
自动代码 常用的有fori/sout/psvm+Tab即可生成循环、System.out、main方法等boilerplate样板代码 。 例如要输入for(User user : users)只需输入user.for+Tab ; 再比如,要输入Date birthday = user.getBirthday()只需输入user.getBirthday().var+Tab即可。 代码标签输入完成后,按Tab,生成代码。
243 0
IntelliJ IDEA 快捷键终极大全,速度收藏!