首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >美团一面:为什么 Spring 和 IDEA 都不推荐使用 @Autowired 注解??

美团一面:为什么 Spring 和 IDEA 都不推荐使用 @Autowired 注解??

作者头像
良月柒
发布于 2024-04-18 04:41:10
发布于 2024-04-18 04:41:10
3751
举报

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

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

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

网上文章大部分都是介绍两者的区别,没有提到为什么,当时想了好久想出了可能的原因,今天来总结一下。另外,最新 Spring 面试题整理好了,大家可以在Java面试库小程序在线刷题。

Spring常见的DI方式

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

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

https://github.com/javastacks/spring-boot-best-practice

@Autowired VS @Resource

事实上,他们的基本功能都是通过注解实现依赖注入,只不过@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个依赖,用构造器注入就会显得庞大,这时候应该考虑一下此组件是不是违反了单一职责原则

为什么IDEA只对@Autowired警告

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

那么问题来了,为什么IDEA只对@Autowired警告,却对@Resource视而不见呢?另外,最新 Spring 面试题整理好了,大家可以在Java面试库小程序在线刷题。

个人认为,就像我们前面提到过的:@AutowiredSpring提供的,它是特定IoC提供的特定注解,这就导致了应用与框架的强绑定,一旦换用了其他的IoC框架,是不能够支持注入的。

@ResourceJSR-250提供的,它是Java标准,我们使用的IoC容器应当去兼容它,这样即使更换容器,也可以正常工作。

<END>

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

本文分享自 程序员的成长之路 微信公众号,前往查看

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

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
1 条评论
热度
最新
我感觉这个是个悖论呀,使用了@Component,@Service这种注解就已经注定了和spring绑在一起了,使用@autowired也正常呀
我感觉这个是个悖论呀,使用了@Component,@Service这种注解就已经注定了和spring绑在一起了,使用@autowired也正常呀
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
Spring依赖注入的三种方式:@Autowired、@Resource、@Inject的全面对比与最佳实践
在软件工程领域,依赖注入(Dependency Injection, DI)作为一种设计模式,已经成为现代Java应用开发的核心范式。它的核心思想是将对象间的依赖关系从代码内部转移到外部容器来管理,通过"注入"的方式将依赖对象传递给需要它的组件。这种机制不仅遵循了"控制反转"(IoC)原则,更显著提高了代码的可测试性、可维护性和灵活性。
用户6320865
2025/08/27
4890
Spring依赖注入的三种方式:@Autowired、@Resource、@Inject的全面对比与最佳实践
Spring的控制反转和依赖注入
在传统的 Java 编程中,我们就像这位“事必躬亲”的厨师——每个对象都要自己创建依赖,导致代码臃肿、耦合严重。
艾伦耶格尔
2025/08/20
2240
Spring的控制反转和依赖注入
面试官:为什么 Spring 和 IDEA 都不推荐使用 @Autowired 注解??
点击关注公众号,Java干货及时送达 作者:小亮哥Ya 链接:https://juejin.cn/post/7080441168462348319 大家在使用IDEA开发的时候有没有注意到过一个提示,在字段上使用Spring的依赖注入注解@Autowired后会出现如下警告: Field injection is not recommended (字段注入是不被推荐的) 但是使用@Resource却不会出现此提示 网上文章大部分都是介绍两者的区别,没有提到为什么,当时想了好久想出了可能的原因,今天来总结一
Java技术栈
2022/09/20
8240
面试官:为什么 Spring 和 IDEA 都不推荐使用 @Autowired 注解??
为什么 Spring 和 IDEA 都推荐使用 @Resource注解而不是@Autowired?
@Autowired 和 @Resource 都是 Spring/Spring Boot 项目中,用来进行依赖注入的注解。它们都提供了将依赖对象注入到当前对象的功能,但二者却有众多不同。
默 语
2024/11/20
7410
为什么 Spring 和 IDEA 都推荐使用 @Resource注解而不是@Autowired?
@Autowired依赖注入为啥不推荐了
这几天更新升级了一下java编码神器IDEA,升级完进行日常开发,可能是以前用的IDEA版本比较老旧,升级之后发现之前的日常写法有了个warning提醒。来看图:
botkenni
2022/09/07
1.7K0
@Autowired依赖注入为啥不推荐了
为什么 Spring和IDEA 都不推荐使用 @Autowired 注解
点击上方“芋道源码”,选择“设为星标” 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 10:33 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | Java 2021 超神之路,很肝~ 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网络应用框架 Netty 源码解析 消息中间件 RocketMQ 源码解析 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析 作业调度中间件 Elastic-Job 源码解析 分布式事务中间件 TCC-Transaction
芋道源码
2022/09/07
5650
为什么 Spring和IDEA 都不推荐使用 @Autowired 注解
面试突击78:@Autowired 和 @Resource 有什么区别?
@Autowired 和 @Resource 都是 Spring/Spring Boot 项目中,用来进行依赖注入的注解。它们都提供了将依赖对象注入到当前对象的功能,但二者却有众多不同,并且这也是常见的面试题之一,所以我们今天就来盘它。 @Autowired 和 @Resource 的区别主要体现在以下 5 点:
磊哥
2022/09/27
15.2K0
面试突击78:@Autowired 和 @Resource 有什么区别?
为什么 Spring 和 IDEA 都不推荐使用 @Autowired 注解
大家在使用IDEA开发的时候有没有注意到过一个提示,在字段上使用Spring的依赖注入注解@Autowired后会出现如下警告
BinGo_Blog
2022/11/01
6000
只因多看了一眼提示,又一次刷新了@Autowired注释的认知
@Autowired和@Resource都可以用于来实现依赖注入,但前者是Spring提供的,后者为JDK(JSR-250标准)自带的。阿里Java开发规范中推荐使用@Resource。但大多数人往往并没有留意为何如此,甚至代码中的提示信息可能都没留意去看。
程序新视界
2020/12/18
9530
25个经典的Spring面试问答
本人收集了一些在大家在面试时被经常问及的关于Spring的主要问题,这些问题有可能在你下次面试时就会被问到。对于本文中未提及的Spring其他模块,我会单独分享面试的问题和答案。
bear_fish
2018/09/19
8070
25个经典的Spring面试问答
大公司为什么禁止在 Spring Boot 项目中使用 @Autowired 注解?
查阅了相关文档了解了一下,原来这个提示是spring framerwork 4.0以后开始出现的,spring 4.0开始就不推荐使用属性注入,改为推荐构造器注入和setter注入。
搜云库技术团队
2023/08/08
6300
大公司为什么禁止在 Spring Boot 项目中使用 @Autowired 注解?
为什么 Spring和IDEA 都不推荐使用 @Autowired 注解
原因详情描述: Inspection info: Spring Team recommends: "Always use constructor based dependency injection in your beans. Always use assertions for mandatory dependencies". 译为: Spring 团队建议: 始终在您的 bean 中使用基于构造函数的依赖注入。始终对强制依赖项使用断言
时间静止不是简史
2022/04/02
1.7K0
为什么 Spring和IDEA 都不推荐使用 @Autowired 注解
Spring为什么建议构造器注入?
本章的内容主要是想探讨我们在进行Spring 开发过程当中,关于依赖注入的几个知识点。感兴趣的读者可以先看下以下问题:
Java旅途
2021/07/13
1.8K0
Spring面试问答Top 25
本人收集了一些在大家在面试时被经常问及的关于Spring的主要问题,这些问题有可能在你下次面试时就会被问到。对于本文中未提及的Spring其他模块,我会单独分享面试的问题和答案。
哲洛不闹
2018/09/18
7600
Spring面试问答Top 25
25个经典的Spring面试问答
Spring框架是一个为Java应用程序的开发提供了综合、广泛的基础性支持的Java平台。Spring帮助开发者解决了开发中基础性的问题,使得开发人员可以专注于应用程序的开发。Spring框架本身亦是按照设计模式精心打造,这使得我们可以在开发环境中安心的集成Spring框架,不必担心Spring是如何在后台进行工作的。
小冷coding
2023/05/24
4020
25个经典的Spring面试问答
为什么不建议使用 @Autowired 字段注入却还可以使用 @Resource
👋 你好,我是 Lorin 洛林,一位 Java 后端技术开发者!座右铭:Technology has the power to make the world a better place.
Lorin 洛林
2023/11/10
1.5K0
为什么不建议使用 @Autowired 字段注入却还可以使用 @Resource
Spring之IOC容器
spring core提供了IOC,DI,Bean配置装载创建的核心实现 核心概念: Beans、BeanFactory、BeanDefinitions、ApplicationContext
Java微观世界
2025/01/21
3030
Spring之IOC容器
Spring注解-@Autowired注解使用
首先要知道另一个东西,default-autowire,它是在xml文件中进行配置的,可以设置为byName、byType、constructor和autodetect;比如byName,不用显式的在bean中写出依赖的对象,它会自动的匹配其它bean中id名与本bean的set**相同的,并自动装载。 @Autowired是用在JavaBean中的注解,通过byType形式,用来给指定的字段或方法注入所需的外部资源。 两者的功能是一样的,就是能减少或者消除属性或构造器参数的设置,只是配置地方不一样而已。 autowire四种模式的区别
SerMs
2022/04/11
1.1K0
Spring注解-@Autowired注解使用
Spring复杂的IOC容器之短小的注解篇
在使用依赖注入绑定FXNews相关实现类时,为了减少配置量,我们可以采用Spring的IoC容器提供的自动绑定功能,如下所示:
大忽悠爱学习
2022/05/10
3930
给学妹看的SpringIOC 面试题(下)
之前上篇跟学弟学妹讲了一下SpringIOC的启动流程,今天接着给学妹聊聊DI—Dependency Injection(依赖注入)
敖丙
2021/09/16
4950
推荐阅读
相关推荐
Spring依赖注入的三种方式:@Autowired、@Resource、@Inject的全面对比与最佳实践
更多 >
领券
一站式MCP教程库,解锁AI应用新玩法
涵盖代码开发、场景应用、自动测试全流程,助你从零构建专属AI助手
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档