面试官:为什么 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)

大家都在看

  • 老徐和阿珍的故事:强引用、软引用、弱引用、虚引用,傻傻分不清楚

    人物背景:老徐,男,本名徐福贵,从事Java相关研发工作多年,职场老油条,摸鱼小能手,虽然岁数不大但长的比较着急,人称老徐。据说之前炒某币败光了所有家产,甚至现在还有欠债。阿珍,女…

    Java 2023年6月7日
    089
  • 加工生产调度 贪心算法 c++

    某工厂收到了 n n 个产品的订单,这 n n 个产品分别在 A,B A ,B 两个车间加工,并且必须先在 A A 车间加工后才可以到 B B 车间加工。某个产品 i i 在 A,…

    Java 2023年6月5日
    070
  • 【笔记整理】SpringBoot集成腾讯云短信

    前言 记录一下最近使用SpringBoot基础腾讯云里的短信产品功能的体验。 1、腾讯云申请开通短信服务。 2、配置短信内容:分别创建签名、模板和群发短信。 3、使用SpringB…

    Java 2023年6月5日
    082
  • 【微服务】- 服务调用-OpenFeign

    服务调用 – OpenFeign 😄生命不息,写作不止🔥 继续踏上学习之路,学之分享笔记👊 总有一天我也能像各位大佬一样🏆 一个有梦有戏的人 @怒放吧德德🌝分享学习心得…

    Java 2023年6月16日
    079
  • 一个简易的SpringCloud Http Post 请求发送工具

    为了方便开发同学,用Python写了一个POST请求发送可执行脚本,方便那些不能使用postman等使用的局域网。当然可以使用CURL命令、用PHP写一个也未尝不可,但并不具备跨平…

    Java 2023年5月30日
    0119
  • leetcode 144. Binary Tree Preorder Traversal 二叉树展开为链表(中等)

    一、题目大意 给你二叉树的根节点 root ,返回它节点值的 前序 遍历。 示例 1: 输入:root = [1,null,2,3]输出:[1,2,3] 示例 2: 输入:root…

    Java 2023年6月14日
    080
  • 邮件任务-springboot

    springboot可以很容易实现邮件的发送 具体实现步骤: org.springframework.boot spring-boot-starter-mail 2.5.2 spr…

    Java 2023年6月13日
    077
  • SQL函数FIND_IN_SET的使用

    可用于查询以逗号分隔开的数据 strlist 字段名 参数以”,”分隔 如 (1,2,6,8) select FIND_IN_SET(‘2&#8…

    Java 2023年6月9日
    064
  • 阻塞非阻塞和同步异步的区分 参考一些书籍

    编程中一直对这两个概念不是很理解,在网上搜了很多资料大概描述的其实都很模糊,有时候还自相矛盾,很容易搞混,这里说一下我对这两个概念的理解。首先看一下相关技术书籍对这两个概念的描述,…

    Java 2023年6月6日
    093
  • Java并发编程艺术系列-四、 Java并发编程基础

    四、 Java并发编程基础 本章将着重介绍Java并发编程的基础知识,从启动一个线程到线程间不同 的通信方式,最后通过简单的线程池示例以及应用(简单的Web服务器)来串联本章所介绍…

    Java 2023年6月9日
    0188
  • @EnableFeignClients注解源码解析

    转载请注明出处: @EnableFeignClients 注解定义的源码 这个注解通过@Import注解导入一个配置类FeignClientsRegistrar.class ;Fe…

    Java 2023年6月8日
    069
  • 字符串匹配—KMP算法

    KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。KMP算法的…

    Java 2023年6月9日
    086
  • Java_day01

    – 简单性- 面向对象- 可移植性- 高性能- 分布式- 动态性- 多线程- 安全性- 健壮性 Java成功的原因 个人认为在于语言本身的优势之外还有个人电脑的普及、互联网的发展等…

    Java 2023年6月5日
    092
  • 找到搜索二叉树中的错误结点

    找到搜索二叉树中的错误结点 问题重述: 一个二叉搜索树,其中的两个结点位置发生了互换,先给出二叉树的根节点,要求得到两个错误的结点 问题分析: 因为二叉搜索树的结构满足,当前节点大…

    Java 2023年6月7日
    077
  • Go mod 使用指定包版本

    使用命令 ,指定版本号即可 go get github.com/xxx/xxx@1.0.0 如果使用的模块项目没有发布新的版本,那么可以使用 git commit SHA go g…

    Java 2023年6月9日
    070
  • jsp中在java里面怎么调文本框里面的值?

    jsp中在java里面怎么调文本框里面的值 方法一: 方法二: Original: https://www.cnblogs.com/muhy/p/14827596.htmlAuth…

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