前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Intellij IDEA 如何去掉 @Autowired 注入警告

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

作者头像
JAVA日知录
发布2020-04-07 18:44:47
3.8K0
发布2020-04-07 18:44:47
举报
文章被收录于专栏:JAVA杂谈JAVA杂谈
问题

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

代码语言:javascript
复制
@Autowired
private ProductMapper productMapper;

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

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

原因

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

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

代码语言:javascript
复制
private final ProductService productService;
@Autowired
public ProductController(ProductService productService) {
	this.productService = productService;
}

or

代码语言:javascript
复制
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这个大家项目都会使用吧)

代码语言:javascript
复制
@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刚好可以完成这件事,而且还简化了你的代码,何乐而不为是不是?

本文参与?腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-04-01,如有侵权请联系?cloudcommunity@tencent.com 删除

本文分享自 JAVA日知录 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 原因
    • 问题是什么
      • 构造器注入 VS Setter注入
      • 怎么解决
        • 认识@RequiredArgsConstructor
        相关产品与服务
        容器服务
        腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
        http://www.vxiaotou.com