Java面试八股之@Autowired 和 @Resource的区别

  1. @Autowired 和 @Resource 的区别

在Spring框架中,@Autowired 和 @Resource 是两个常用的依赖注入注解,但它们有一些关键的区别。下面是这两个注解的主要差异:

1. 注解来源

@Autowired:

是Spring框架提供的注解,位于包 org.springframework.beans.factory.annotation。

专门用于自动装配Bean之间的依赖关系。

@Resource:

是Java标准JSR-250中定义的注解,位于包 javax.annotation.Resource。

虽然最初是为了资源注入而设计的,但在Spring中通常被用来替代 @Autowired。

2. 注入方式

@Autowired:

默认按照类型进行匹配,即查找容器中指定类型的Bean。

如果存在多个相同类型的Bean,则可以配合 @Qualifier 注解指定具体的Bean名称。

如果没有找到匹配的Bean,会抛出 NoSuchBeanDefinitionException 异常。

可以使用 @Autowired(required = false) 来避免找不到Bean时抛出异常。

可以用在字段、构造器、setter方法或任意方法上。

@Resource:

默认按照名称进行匹配,如果找不到匹配名称的Bean,则按类型匹配。

可以通过 name 属性指定Bean的名字,也可以使用 lookup 属性指定一个工厂方法。

可以通过 shareable 属性指定是否共享Bean实例(默认为true)。

如果没有匹配的Bean,@Resource 不会抛出异常,而是注入null。

通常只用在字段或setter方法上。

3. 使用场景

@Autowired:

适用于大多数情况下的依赖注入,特别是在需要明确类型匹配的情况下。

在Spring官方文档中推荐使用 @Autowired。

@Resource:

通常用于更简单的情况,特别是当只有一个Bean实现某个接口时。

如果希望使用JSR-250标准,并且希望保持与其他Java EE组件的一致性,可以考虑使用 @Resource。

4. 注解优先级

@Autowired:

优先级较低,不会覆盖其他显式的Bean引用。

@Resource:

优先级较高,可以覆盖其他显式的Bean引用,这意味着如果有其他显式的Bean引用,@Resource 仍然会尝试注入。

总结

尽管 @Autowired 和 @Resource 都可以完成依赖注入的任务,但它们之间存在一些重要的区别。在大多数情况下,@Autowired 是Spring推荐的选择,因为它更符合Spring的设计理念,并且提供了更灵活的控制选项。然而,在某些特定场景下,如遵循Java EE规范或简化代码时,@Resource 也可能是一个合适的选择。

如果大家需要视频版本的讲解,欢迎关注我的B站:

相关推荐
輕華2 分钟前
PyQt5入门实战:安装、QtDesigner设计与PyUIC转换完整指南
开发语言·qt
虹梦未来2 分钟前
【开发心得】在SpringBoot体系中正确使用redisConfig
java·spring boot·spring
skiy3 分钟前
Spring Framework 中文官方文档
java·后端·spring
xifangge202519 分钟前
【故障排查】IDEA 打开 Java 文件没有运行按钮(Run)?深度解析项目标识与环境配置的 3 大底层坑点
java·ide·intellij-idea
麻辣璐璐19 分钟前
EditText属性运用之适配RTL语言和LTR语言的输入习惯
android·xml·java·开发语言·安卓
weisian15124 分钟前
Java并发编程--33-Redis分布式缓存三大核心架构:主从、哨兵、分片,落地实战与选型
java·redis·缓存·主从架构·哨兵架构·分片架构
APIshop34 分钟前
Python 爬虫获取京东商品详情 API 接口实战指南
java·服务器·数据库
2301_8035545238 分钟前
C++ 并发核心:std::promise、std::future、std::async 超详细全解
开发语言·c++
wang090739 分钟前
Linux性能优化之内存管理基础知识
java·linux·性能优化
俺不要写代码1 小时前
线程启动、结束,创建线程多法、join,detach,线程的移动语义
服务器·开发语言·网络·c++