问题

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

1

2

@Autowired

private ProductMapper productMapper;

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

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

原因

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

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

1

2

3

4

5

private final ProductService productService;

@Autowired

public ProductController(ProductService productService) {

    this.productService = productService;

}

or

1

2

3

4

5

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这个大家项目都会使用吧)

1

2

3

4

5

6

7

@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刚好可以完成这件事,而且还简化了你的代码

@RequiredArgsConstructor(onConstructor = @__(@Autowired)) Intellij IDEA如何去掉@Autowired 注入警告的方法相关推荐

  1. @RequiredArgsConstructor(onConstructor = @__(@Autowired))报错原因

    有几个原因: 1. 没装lombok 如果你是idea,那就不需要下载lombok,只需要在依赖中添加lombok依赖就好,idea自动装了lombok. 2. 版本错误 有的版本是_一个下划线,有的 ...

  2. @autowired注入mapper_Intellij IDEA中Mybatis Mapper自动注入警告的6种解决方案

    相信使用Mybaits的小伙伴们一定会经常编写类似如下的代码: 可以看到 userMapper 下有个红色警告.虽然代码本身并没有问题,能正常运行,但有个警告总归有点恶心.本文分析原因,并列出解决该警 ...

  3. @autowired注解注入为null_Intellij IDEA中Mybatis Mapper自动注入警告的6种解决方案

    相信使用Mybaits的小伙伴们一定会经常编写类似如下的代码: 可以看到 userMapper 下有个红色警告.虽然代码本身并没有问题,能正常运行,但有个警告总归有点恶心.本文分析原因,并列出解决该警 ...

  4. Intellij IDEA中Mybatis Mapper自动注入警告的6种解决方案

    相信使用Mybaits的小伙伴们一定会经常编写类似如下的代码: 可以看到 userMapper 下有个红色警告.虽然代码本身并没有问题,能正常运行,但有个警告总归有点恶心.本文分析原因,并列出解决该警 ...

  5. 去掉@Autowired注解下面的黄色警示波浪线

    去掉 @Autowired注解下面的波浪线 具体操作如下图所示即可: 说明: 1.好多文章上将 Error stripe mark的复选框也取消勾选,我觉得只取消Effects的复选框就能达到取消黄色 ...

  6. IntelliJ IDEA 学习笔记 - @Autowired 报红波浪线

    IntelliJ IDEA 学习笔记 - @Autowired 报红波浪线 情况一: 属性注入 情况二: 构造注入 最终效果 自欺欺人解决方案 方案1. 换 `@Resource` (这个我爱用) 方 ...

  7. nginx php 后缀名,nginx去掉php后缀名的方法

    nginx去掉php后缀名的方法 发布时间:2020-09-30 14:36:49 来源:亿速云 阅读:68 作者:小新 小编给大家分享一下nginx去掉php后缀名的方法,相信大部分人都还不怎么了解 ...

  8. Intellij+maven:jar包冲突的解决方法(Hbase和Guava的冲突)

    Intellij+maven:jar包冲突的解决方法(Hbase和Guava的冲突) 参考文章: (1)Intellij+maven:jar包冲突的解决方法(Hbase和Guava的冲突) (2)ht ...

  9. SpringBoot集成Quartz(解决@Autowired空指针Null问题即依赖注入的属性为null)

    SpringBoot集成Quartz(解决@Autowired空指针Null问题即依赖注入的属性为null) 参考文章: (1)SpringBoot集成Quartz(解决@Autowired空指针Nu ...

  10. 去掉linux开关机图片,在Deepin Linux系统下去掉NVIDIA开机Logo的方法

    要实现在deepin Linux或其他Linux系统下去掉NVIDIA开机Logo非常的简单,只需要两步就可以了,可以运用命令操作,也可手动操作.安装NVIDIA请参考在deepin系统中安装英伟达N ...

最新文章

  1. 【解题报告系列】超高质量题单 + 题解(ACM / OI)超高质量题解
  2. 如何利用计算机计算天数,计算机如何计算两个日期之间的天数
  3. MPLS QoS的实现——微云专线
  4. excel随机数_如何使用excel高效背GRE单词?
  5. ML之多分类预测之PLiR:使用PLiR实现对六类label数据集进行多分类
  6. puppet结构图一例
  7. UpdatePanel中用后台调用Javascript
  8. 遗传算法求最短路径(旅行商问题)python实现
  9. 今日头条的,顶部导航,实现分析
  10. nginx配置文件语法高亮的Sublime Text扩展
  11. LeetCode--75.颜色分类(三路快排,计数排序)
  12. PAT 1012 数字分类 (20)
  13. SCOM2012功能测试(18)—对象发现(替代)
  14. Unity shader实现水效果(折射,反射,波浪,1.菲尼尔,深度颜色)
  15. CS224N笔记——词向量表示
  16. 中的draw函数_哪一个热图函数更快?
  17. 3打开db文件_sqlite库学习(3)为什么sqlite3_open会失败
  18. 【最优估计学习笔记】概率密度函数
  19. 3 linux禁用ssl_linux – Poodle:在服务器上禁用SSL V3真的是一个解决方案吗?
  20. kali下一句话升级metasploit

热门文章

  1. [Canvas]空战游戏进阶 增加己方子弹管理类
  2. Codeforces Round #102 (Div. 1) D Help Shrek and Donkey 2
  3. 出现”/var/lib/mysql/mysql.sock“不存在的解决方法
  4. Linux嵌入式学习-ds18b20驱动
  5. hdu 2196(求树上每个节点到树上其他节点的最远距离)
  6. [转载]用户(User)和用户组(Grou…
  7. Flutter 移动端屏幕适配方案和制作
  8. K3 WISE 开发插件《SQL语句WHERE查询-范围查询/模糊查询》
  9. java并发编程(四) 线程池 任务执行、终止源码分析
  10. 用maven编译spark2.1.0