大聪明教你学Java | 深入浅出聊 @Autowired 和 @Resource

本文详细比较了Java开发中Spring框架中的@Autowired和@Resource注解,解释了它们的使用场景、装配方式、适用范围和差异,帮助开发者更好地理解和选择依赖注入的方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

🍊作者简介: 不肯过江东丶,一个来自二线城市的程序员,致力于用“猥琐”办法解决繁琐问题,让复杂的问题变得通俗易懂。
🍊支持作者: 点赞👍、关注💖、留言💌~

在 Java 开发中,我们经常会遇到需要依赖注入的情况。依赖注入是一种设计模式,它可以帮助我们管理对象之间的依赖关系,提高代码的可维护性和可测试性。而在 Spring 框架中,有两个常用的注解 @Autowired 和 @Resource,它们都可以用来实现依赖注入。但是可能有些小伙伴对二者并不是很了解,或者说是不清楚二者之间的区别,那么今天大聪明就跟各位小伙伴深入浅出的聊一聊 @Autowired 和 @Resource 的区别。

@Autowired 注解和 @Resource 注解

@Autowired 和 @Resource 都是 Java 中用于依赖注入的注解,它们能够帮助开发者实现对类成员、方法和构造函数等的自动装配。然而,它们在使用方式、适用范围以及功能上存在一些差异。

@Autowired

@Autowired 是 Spring 框架自带的注解,用于实现自动装配。它通过类型匹配的方式,在容器中查找匹配的Bean,并将其注入到目标对象中。@Autowired 可以用在构造方法、字段、Setter方法和普通方法上。当被注解的元素被调用时,Spring 会自动查找并注入匹配的 Bean。如果有多个匹配的 Bean存在,可以通过 @Qualifier 注解指定具体的Bean名称。示例代码如下👇


@Autowired
private UserService userService;

@Autowired
public UserController(UserService userService) {
    this.userService = userService;
}

@Autowired
public void setUserService(UserService userService) {
    this.userService = userService;
}

我们在上面提到一句话:“可以通过 @Qualifier 注解来指定具体的Bean名称”,我们再来一起看看 @Qualifier 注解如何使用。@Qualifier 注解是 Spring 框架提供的用于限定符的注解,它可以与 @Autowired 一起使用。通过在 @Autowired 注解上添加 @Qualifier 注解,并指定具体的 Bean 名称作为参数,可以告诉 Spring 容器要注入哪个具体的 Bean。例如👇


@Autowired
@Qualifier("userService")
private UserService userService;

在上述示例中,我们使用@Autowired注解注入了一个 UserService 类型的 Bean,并通过 @Qualifier 注解指定了具体的 Bean 名称为 “userService”。这样,Spring 容器会根据指定的名称找到对应的 Bean,并将其注入到 userService 属性中。需要注意的是,@Qualifier 注解的参数值必须与目标 Bean 的名称一致,否则会抛出 NoSuchBeanDefinitionException 异常(表示在容器中找不到对应的Bean定义)。

@Resource

@Resource 是 JavaEE 标准的注解,也可用于实现依赖注入。它通过名称匹配的方式,在容器中查找匹配的Bean,并将其注入到目标对象中。@Resource 可以用在字段、Setter 方法和普通方法上。它可以通过 name 属性指定要注入的 Bean 名称,也可以通过 type 属性指定要注入的 Bean 类型。如果没有指定 name 或 type 属性,则默认按照名称匹配查找。示例代码如下👇


@Resource
private UserService userService;

@Resource(name = "userService")
public void setUserService(UserService userService) {
    this.userService = userService;
}

@Resource(name="userName", type=String.class)
private String userName;

@Autowired 和 @Resource 的异同

🌲 相同点 🌲

  • 作用相同: 两者都用于实现依赖注入,可以自动装配一个bean到需要它的地方。
  • 实现依赖注入: 均可以在类的字段、Setter方法或构造函数上使用,用于告诉容器注入特定的依赖。

🌴 不同点 🌴

1、来源和适用范围:

  • @Autowired 是 Spring Framework的一部分,广泛用于 Spring 应用中,可以用在字段、构造函数以及Setter方法上。
  • @Resource 是 Java EE 规范的一部分,更通用,可以用在字段和Setter方法上,但不支持构造函数注入。

2、装配方式:

  • @Autowired根据类型进行装配,容器会根据类型自动在上下文中查找匹配的bean进行注入。
  • @Resource根据名称进行装配,默认按照变量名匹配,也可以通过name属性指定名称进行注入。

3、限制:

  • @Autowired默认情况下要求依赖是必须存在的(除非使用@Autowired(required = false)设置为非必须)。
  • @Resource默认按名称匹配,必须存在与指定名称相匹配的bean。

4、兼容性:

  • @Autowired 是Spring 特有的注解,因此在 Spring 应用中使用广泛。
  • @Resource 是 Java EE 标准的一部分,因此具有更广泛的兼容性,可以在不同的 Java EE 容器中使用。

5、用法差异:

  • @Autowired 可以与 @Qualifier 联合使用,解决多个相同类型的 bean 自动装配问题。
  • @Resource 不支持构造函数注入,并且不能与 @Qualifier 一同使用。

小结

本人经验有限,有些地方可能讲的没有特别到位,如果您在阅读的时候想到了什么问题,欢迎在评论区留言,我们后续再一一探讨🙇‍

希望各位小伙伴动动自己可爱的小手,来一波点赞+关注 (✿◡‿◡) 让更多小伙伴看到这篇文章~ 蟹蟹呦(●’◡’●)

如果文章中有错误,欢迎大家留言指正;若您有更好、更独到的理解,欢迎您在留言区留下您的宝贵想法。

你在被打击时,记起你的珍贵,抵抗恶意;
你在迷茫时,坚信你的珍贵,抛开蜚语;
爱你所爱 行你所行 听从你心 无问东西

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不肯过江东丶

您的鼓励将是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值