高级java每日一道面试题-2024年12月20日-Spring篇-Autowired和Resource注解的区别?

如果有遗漏,评论区告诉我进行补充

面试官: Autowired和Resource关键字的区别?

我回答:

在Java高级面试中,@Autowired和@Resource是两个经常被提到的注解,它们主要用于Spring框架中的依赖注入。下面是对这两个注解的详细解释和它们之间的区别:

一、@Autowired注解

  1. 来源 :@Autowired是Spring框架提供的注解,用于实现自动装配。
  2. 注入方式 :@Autowired可以用在字段、构造方法、Setter方法上,用于实现自动装配。Spring会根据类型(by type)进行自动匹配。
  3. 匹配规则 :
    • 当有多个类型匹配时,Spring会根据类型选择合适的bean进行注入。
    • 如果存在多个相同类型的bean,可以使用@Qualifier注解指定要注入的bean的名称。
  4. 依赖查找顺序 :@Autowired首先根据类型进行查找,如果存在多个相同类型的bean,则再根据名称进行查找。
  5. 参数 :@Autowired只支持一个required参数,表示是否开启自动注入,默认是true,要求依赖对象必须存在。如果允许null值,可以设置为false。

二、@Resource注解

  1. 来源 :@Resource是Java EE的规范,是JSR-250规范定义的注解,也是Java标准的一部分。它同样可以在Spring应用中使用,但不同于@Autowired,它并不是Spring的特有注解。
  2. 注入方式 :@Resource可以用在字段、Setter方法上,也可以用在配置文件的bean定义上(虽然不常见)。它默认按照名称(by name)进行自动装配,但也支持按照类型进行匹配。
  3. 匹配规则 :
    • 如果指定了name属性,则按照指定的名称进行匹配。
    • 如果没有指定name属性,则默认按照字段名或方法名进行匹配。
    • 如果找不到与名称匹配的bean,则按照类型进行匹配。
  4. 依赖查找顺序 :@Resource首先根据名称进行查找,如果找不到匹配的bean,则再按照类型进行查找。
  5. 参数 :@Resource支持多个参数,其中最重要的两个参数是name和type。通过这两个参数,可以精确地指定要注入的bean。

三、@Autowired和@Resource的区别

  1. 来源不同 :@Autowired是Spring框架提供的注解,而@Resource是Java EE的规范。
  2. 注入方式不同 :@Autowired主要用在字段、构造器和Setter方法上,而@Resource可以用在字段、Setter方法上,还可以用在配置文件的bean定义上(虽然不常见)。
  3. 匹配规则和查找顺序不同 :@Autowired默认按照类型进行匹配,如果存在多个相同类型的bean,则再根据名称进行查找;而@Resource默认按照名称进行匹配,如果找不到匹配的bean,则再按照类型进行查找。
  4. 参数不同 :@Autowired只支持一个required参数,而@Resource支持多个参数,包括name和type等。
  5. 兼容性 :在Spring应用中,@Autowired和@Resource都可以用于依赖注入,但@Autowired是Spring特有的注解,与Spring框架的集成度更高;而@Resource作为Java EE的规范,在跨平台、跨框架的应用中可能更具兼容性。
特性 @Autowired @Resource
注解来源 Spring 框架 Java EE (Jakarta EE) 标准
默认注入方式 按类型 (byType) 按名称 (byName),若找不到则按类型
支持的作用位置 构造函数、字段、setter 方法 字段、setter 方法
是否推荐构造器注入 是,特别是对于必须依赖 否
自动装配策略 支持多种模式,默认为 byType 默认为 byName
可选性配置 required=false name="" 或 lookup-method

四、使用建议

  1. 当一个接口类只有一个实现类时,@Autowired和@Resource都可以使用,但@Resource不会触发IDE的警告或错误提示。
  2. 当一个接口类有多个实现类时,应谨慎使用@Autowired,因为它可能会导致不明确的依赖注入。此时,可以结合@Qualifier注解来指定要注入的bean的名称,或者使用@Resource并通过name属性来精确指定要注入的bean。
相关推荐
Wang's Blog1 天前
Java 项目实战: 交友项目 - 发布圈子动态:数据库表和接口文档介绍
java·数据库·交友
paopaokaka_luck1 天前
智慧电玩店管理系统(空闲机台随机分配、游玩时长概率模拟、积分自动结算、积分兑换闭环、 ECharts经营分析、 腾讯地图选址)
java·人工智能·mysql·echarts·推荐算法
LMT流氓兔1 天前
第五单元——第9课:防止同一次操作重复执行
java·服务器·数据库·算法·ai·langchain
OxYGC1 天前
Spring 面经系列 · 第 6 篇:Spring MVC 请求全流程、父子容器与零配置原理
java·spring·mvc
code2cat1 天前
Java高级篇之JDBC:连接数据库,完成查询、更新与事务
java·开发语言·数据库
bksczm1 天前
Redis数据结构之string
java·redis·mybatis
cc_瀚海知行1 天前
资料检索 1|直接放入全文、按需读文件和先检索,有什么区别?
java·人工智能·ai
BioRunYiXue1 天前
使用docker分析高通量测序数据
java·数据库·人工智能·spring cloud·docker·tomcat·html
Shaoshing1 天前
缓存一致问题及常见解决方案
java·缓存
聚美智数1 天前
文档转换 API‑文档转 PDF‑PDF 转文档‑异步文档处理‑文件格式迁移‑转换结果回调推送 API 接口介绍
android·java·pdf