面试官:为什么 Spring 和 IDEA 都不推荐使用 @Autowired 注解??

大家在使用IDEA开发的时候有没有注意到过一个提示,在字段上使用Spring的依赖注入注解 @Autowired后会出现如下警告

Field injection is not recommended (字段注入是不被推荐的)

但是使用 @Resource却不会出现此提示

网上文章大部分都是介绍两者的区别,没有提到为什么,当时想了好久想出了可能的原因,今天来总结一下

Spring常见的DI方式

  • 构造器注入:利用构造方法的参数注入依赖
  • Setter注入:调用Setter的方法注入依赖
  • 字段注入:在字段上使用@Autowired/Resource注解

推荐一个开源免费的 Spring Boot 最全教程:

事实上,他们的基本功能都是通过注解实现 依赖注入,只不过 @AutowiredSpring定义的,而 @ResourceJSR-250定义的。大致功能基本相同,但是还有一些细节不同:

  • 依赖识别方式:@Autowired默认是 byType可以使用@Qualifier指定Name,@Resource 默认ByName如果 找不到则ByType
  • 适用对象:@Autowired可以对 构造器、方法、参数、字段使用,@Resource只能对 方法、字段使用
  • 提供方:@Autowired是 Spring提供的,@Resource是 JSR-250提供的

各种DI方式的优缺点

参考Spring官方文档,建议了如下的使用场景:

  • 构造器注入强依赖性(即必须使用此依赖), 不变性(各依赖不会经常变动)
  • Setter注入可选(没有此依赖也可以工作), 可变(依赖会经常变动)
  • Field注入:大多数情况下尽量 少使用字段注入,一定要使用的话, @Resource相对@Autowired对IoC容器的 *耦合更低

Field注入的缺点

  • 不能像构造器那样注入不可变的对象
  • 依赖对外部不可见,外界可以看到构造器和setter,但无法看到私有字段,自然无法了解所需依赖
  • 会导致 组件与IoC容器紧耦合(这是最重要的原因,离开了IoC容器去使用组件,在注入依赖时就会十分困难)
  • 导致 单元测试也必须使用IoC容器,原因同上
  • 依赖过多时不够明显,比如我需要10个依赖,用构造器注入就会显得庞大,这时候应该考虑一下此组件是不是 *违反了单一职责原则

Field注入虽然有很多缺点,但它的好处也不可忽略:那就是 太方便了。使用构造器或者setter注入需要写更多业务无关的代码,十分麻烦,而字段注入大幅简化了它们。并且绝大多数情况下业务代码和框架就是强绑定的,完全松耦合只是一件理想上的事,牺牲了敏捷度去过度追求松耦合反而得不偿失。

那么问题来了,为什么IDEA只对@Autowired警告,却对@Resource视而不见呢?

个人认为,就像我们前面提到过的: @AutowiredSpring提供的,它是 特定IoC提供的特定注解,这就导致了应用与框架的 强绑定,一旦换用了其他的IoC框架,是 不能够支持注入的。而 @ResourceJSR-250提供的,它是 Java标准,我们使用的IoC容器应当去兼容它,这样即使更换容器,也可以正常工作。

近期热文推荐:

觉得不错,别忘了随手点赞+转发哦!

Original: https://www.cnblogs.com/javastack/p/16715251.html
Author: Java技术栈
Title: 面试官:为什么 Spring 和 IDEA 都不推荐使用 @Autowired 注解??

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/617004/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 谈谈我对Reactive Programming的理解

    Microsoft于2012年的时候在.NET生态中实现了反应式扩展库,简称ReactiveX或Rx。跟着RxJava又开发了JVM上的实现。之后Pivotal、Netflix、L…

    Java 2023年6月5日
    076
  • Hibernate基础入门2

    HQL与Criteria HQL(Hibernate Query Language)-官方推荐面向对象的查询语言,与SQL不同,HQL中的对象名是区分大小写的(除了JAVA类和属性…

    Java 2023年6月9日
    059
  • maven添加oracle的依赖驱动

    1、下载需要的jdbc jar 包 2、下载jar包 3、在当前目录下输入cmd进入控制台 4、控制台输入 命令解释 5、执行后有如下就表示成功 6、在maven配置 1、下载需要…

    Java 2023年6月5日
    095
  • 【部署系列】Docker 部署 acme.sh

    安装环境 Docker安装 具体的安装直接参考Docker官方文档即可: https://docs.docker.com/engine/install/ 以centos系统为例: …

    Java 2023年6月8日
    091
  • MyBatis Generator备份

    博客园 :当前访问的博文已被密码保护 请输入阅读密码: Original: https://www.cnblogs.com/ys-wuhan/p/7126391.htmlAutho…

    Java 2023年5月30日
    047
  • 【主流技术】Redis 在 Spring 框架中的实践

    前言 一、Redis 概述 1.1Redis 是什么? 1.2Redis 能做什么? 1.3基础知识 二、Redis 安装与基本命令 2.1Windows 安装 方式一 方式二 2…

    Java 2023年6月6日
    060
  • Linux常用命令总结

    端口防火墙相关 开放指定端口: firewall-cmd –zone=public –add-port=5601/tcp –permanent 开启/重启防火墙: syste…

    Java 2023年6月7日
    078
  • Javaweb06-JDBC

    1、jdbc.properties配置文件 jdbc.properties driverClass=com.mysql.jdbc.Driver jdbcUrl=jdbc:mysql…

    Java 2023年6月15日
    066
  • harbor安装

    Harbor 简介 Docker容器应用的开发和运行离不开可靠的镜像管理,虽然Docker官方也提供了公共的镜像仓库,但是从安全和效率等方面考虑,部署我们私有环境内的Registr…

    Java 2023年6月15日
    089
  • 如此狂妄,自称高性能队列的Disruptor有啥来头?

    并发框架Disruptor 1. Disruptor概述 1.1 背景 ​ Disruptor是英国外汇交易公司LMAX开发的一个高性能队列,研发的初衷是解决内存队列的延迟问题(在…

    Java 2023年6月15日
    063
  • 自写自查CPU过高问题

    自写自查CPU过高问题 自写自查CPU过高问题 1、问题 2、制造问题(通过docker方式) 2.1、准备文件内容 2.2、构建镜像 3、排查问题 4、定位问题 5、解决问题 6…

    Java 2023年6月7日
    085
  • Android–数据库创建

    ​ 新建帮助类 创建一个类并继承 SQLiteOpenHelper import android.content.Context; import android.database….

    Java 2023年6月8日
    051
  • 第三周

    第三周 1.测试成功的接口再次测试报错 原因:之前在查询时更改了方法,由Mybatis Plus 查询的方式改为了xml,同时在实体类中添加了字段做连表查询,导致之前所有用Myba…

    Java 2023年6月7日
    082
  • 复杂逻辑题目的好帮手:注释和断言

    前言 最近在刷题的时候,遇到一些逻辑比较复杂的题,往往会遇到困难,经常写不出来。即使在有debug帮助的时候,也往往会出现思虑不周,导致一错再错的情况,即好不容易debug通过一个…

    Java 2023年6月9日
    066
  • Linux 搞乱、有趣的命令

    1、sl命令 你会看到一辆火车从屏幕右边开往左边…… 安装 sudo yum -y install sl 运行 sl 命令有 -a l F e几个选项,加上…

    Java 2023年6月5日
    067
  • Nginx配置SSL证书

    在我们下载的证书文件中有一个Nginx的文件夹,这里面的两个文件都是需要的。我们需要把这个两个文件上传到 linux 服务器中,推荐放到 /etc/ssl/目录下 然后我们需要去找…

    Java 2023年5月30日
    071
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球