大聪明教你学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 一同使用。

小结

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

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

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

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

<think>好的,用户想了解Java面试中@Autowired@Resource注解的区别,尤其是在Spring框架中的使用。我需要先回顾一下这两个注解的基本信息,然后根据提供的引用内容整理出它们的主要区别。首先,@Autowired是Spring提供的,而@ResourceJava的JSR-250规范中的,这点在引用2、3、4中都有提到。然后是它们的默认注入方式不同,@Autowired按类型,@Resource按名称,这也是引用4提到的。接着是当一个接口有多个实现类时,两者如何处理,需要用到@Qualifier或name属性,这部分引用4也详细说明了。另外,使用范围的不同,@Autowired只能在Spring中使用,而@Resource更通用,引用2、3都强调了这一点。接下来,我需要将这些点有条理地组织起来,用中文清晰回答,并且按照用户的要求,使用正确的LaTeX格式,生成相关问题。还要注意引用标识的正确添加。可能需要检查是否有遗漏的区别,比如是否需要提到它们的来源、依赖注入的具体例子,或者是否涉及其他特性,比如是否支持构造函数注入等。根据现有引用,没有提到这些额外内容,所以可能不需要。最后,生成的相关问题要围绕这两个注解的区别应用场景,比如使用场景、如何解决多个实现的问题、默认行为等。确保回答结构清晰,分点说明,并引用正确的来源。</think>### Spring中@Autowired@Resource的区别及用法比较 在Java面试中,`@Autowired``@Resource`是Spring框架中依赖注入的常见考点。以下是两者的核心区别及用法对比: #### 1. **来源不同** - **`@Autowired`**:由Spring框架定义,属于Spring生态特有注解,只能在Spring环境中使用[^2][^3]。 - **`@Resource`**:由JSR-250规范定义,属于JavaEE标准注解,不依赖Spring框架,兼容性更强[^2]。 #### 2. **默认注入方式** - **`@Autowired`**:默认按类型(`ByType`)注入。例如: ```java @Autowired private UserService userService; // 根据UserService类型查找Bean ``` 若存在多个同类型Bean,需结合`@Qualifier("beanName")`指定名称[^4]。 - **`@Resource`**:默认按名称(`ByName`)注入。例如: ```java @Resource private UserService userServiceImpl; // 根据字段名"userServiceImpl"匹配Bean名称 ``` 若需显式指定名称,可通过`@Resource(name = "beanName")`实现。 #### 3. **处理多实现类的方式** - **`@Autowired`**:必须配合`@Qualifier`注解指定Bean名称: ```java @Autowired @Qualifier("userServiceImplA") private UserService userService; ``` - **`@Resource`**:直接通过`name`属性指定: ```java @Resource(name = "userServiceImplB") private UserService userService; ``` #### 4. **适用范围** - **`@Autowired`**:仅支持Spring框架,与其他框架(如非Spring的JavaEE项目)不兼容。 - **`@Resource`**:兼容所有支持JSR-250规范的框架,适用范围更广。 #### 5. **依赖关系** - **`@Autowired`**:需要引入Spring核心库(如`spring-beans`)。 - **`@Resource`**:需依赖`javax.annotation`包(JDK自带,但部分版本需单独引入)。 --- ### 总结表格 | 特性 | @Autowired | @Resource | |--------------------|---------------------------|---------------------------| | **来源** | Spring框架 | JSR-250规范 | | **默认注入方式** | ByType | ByName | | **多实现类处理** | 需结合@Qualifier | 通过name属性指定 | | **框架兼容性** | 仅Spring | 支持所有JavaEE兼容框架 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

不肯过江东丶

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

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

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

打赏作者

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

抵扣说明:

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

余额充值