Spring中的@Resource和@Autowired有什么区别?

你好,我是风一样的树懒,一个工作十多年的后端开发,曾就职京东、阿里等多家互联网头部企业。

点击下方👇关注公众号,带你一起复习后端技术,看看面试考点,补充积累技术知识,每天都为面试准备积累


在 Spring 中,@Resource 和 @Autowired 都是用于依赖注入(DI,Dependency Injection)的注解。虽然它们的功能相似,但在行为和用法上有一些区别。以下是它们的详细对比:


01
注解来源


@Autowired:来自 Spring 框架,属于 Spring 的依赖注入注解。

@Resource:来自 Java 的 javax.annotation 包,属于 JSR-250 规范。Spring 支持 @Resource,它通常用在基于 Java EE 的项目中。


02
依赖注入的方式


@Autowired:默认按 类型(byType)注入。Spring 会根据字段或方法参数的类型进行匹配,找出最适合的 Bean。

  • 可以指定按名称注入:通过 @Autowired 配合 @Qualifier 注解,可以按 名称(byName)注入。

@Resource:默认按 名称(byName)注入。Spring 会首先查找与字段名相同的 Bean,如果找到了,则将该 Bean 注入。如果没有找到与字段名匹配的 Bean,则会按 类型(byType)注入。

@Resourceprivate UserService userService; // 按名称 userService 注入@Autowiredprivate UserService userService; // 按类型 userService 注入



03
属性或构造函数注入


@Autowired:

  • 可以应用于构造函数、字段、或方法。

  • 如果标注在构造函数上,Spring 会尝试自动注入该构造函数的参数。

@Resource:
  • 只适用于字段或方法。

  • 不支持构造函数注入。

// @Autowired 构造函数注入@Autowiredpublic UserController(UserService userService) {    this.userService = userService;}// @Resource 字段注入@Resourceprivate UserService userService;


04
是否允许空注入


@Autowired:

  • 默认情况下,如果 Spring 容器找不到匹配的 Bean,且该依赖没有标记为 @Nullable 或使用 required = false,则会抛出 NoSuchBeanDefinitionException 异常。

  • 可以通过 required 属性来控制是否允许空值注入,默认是 true。

@Autowired(required = false)private UserService userService; // 如果找不到 UserService,userService 为 null

@Resource:

  • 默认情况下,如果没有找到匹配的 Bean,@Resource 注解不会抛出异常,而是会尝试根据类型来注入(如果字段名称没有匹配的 Bean)。


05
优先级


@Autowired:Spring 会根据 类型 进行自动注入。如果存在多个相同类型的 Bean,可以通过 @Qualifier 注解指定要注入的 Bean。

@Resource:@Resource 首先按 名称 注入,如果没有找到匹配的名称,则按 类型 注入。

@Resourceprivate UserService userService; // 默认按名称 userService 注入


06
主要区别总结


特性@Autowired@Resource
注解来源Spring 框架Java 标准(JSR-250)
默认按类型(byType)名称(byName),如果未找到则按类型(byType)
可用于构造函数、字段、方法仅字段和方法
空注入处理默认 required = true,可设置为 false默认允许按类型注入,按名称时会直接匹配
优先级@Qualifier 用于解决多个相同类型的 Bean按名称注入,未找到时按类型注入


07
选择何时使用哪个


如果你的代码遵循 Java EE 标准或你需要按照 名称 进行注入,使用 @Resource。

如果你使用 Spring 框架,并且希望利用 类型 自动注入(特别是当你不关心 Bean 名称时),使用 @Autowired。同时,Spring 提供了更多控制注入的功能,比如 @Qualifier 和 required 等。


今天的内容就分享到这儿,喜欢的朋友可以关注,点赞。有什么不足的地方欢迎留言指出,您的关注是我前进的动力!

END


扫码关注

一起积累后端知识
不积跬步,无以至千里
不积小流,无以成江海

喜欢此内容的人还喜欢

谈谈id那些事(五)——美团的 Leaf 的ID生成


一个阿里二面面试官必问的问题


Lambda表达式说爱你不容易


分享面试:mysql数据库索引失效的情况


Spring-Boot中一个不起眼的好工具StopWatch