【springboot】你了解@Autowired 和 @Resource吗?@Autowired 和 @Resource深入分析

本文深入探讨了Spring的@Autowired和J2EE的@Resource注解的来源、作用及区别。@Autowired默认按类型注入,当有多个匹配bean时,可通过@Qualifier指定。而@Resource默认按名称注入,未指定时会按类型寻找,导致冲突。解决冲突可明确指定name属性。

我们在开发中,一直用到的都是@Autowired,那么为什么这么用有没有想过?还有@Resource也可以作为注入的注解,为什么又不用?

“认祖归宗”–@Autowired 和 @Resource来源

那么首先,我们得知道这两个注解,他们是来自于哪?
@Autowired

package org.springframework.beans.factory.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({
   
   ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE}
<think>我们正在讨论SpringBoot中的两个注解:@Autowired@Resource。根据引用内容,我们可以总结如下:1.**注解来源**:- `@Autowired`是Spring框架提供的注解,属于Spring的核心注解之一。- `@Resource`是Java的标准注解,属于JavaEE规范(JSR-250)。2.**默认注入方式**:-`@Autowired`默认按类型(byType)进行注入。如果同一个接口有多个实现类,则需要配合`@Qualifier`注解指定具体的bean名称。-`@Resource`默认按名称(byName)进行注入。如果没有指定名称,则按类型进行注入。3.**使用场景**:- `@Autowired`适用于Spring框架环境,如果项目是纯SpringSpring Boot,可以使用它。-`@Resource`是Java标准注解,因此可以用于非Spring环境(如其他Java EE容器),但在Spring中也可以使用。 4. **装配顺序**(引用[2]中提到):- `@Autowired`的装配顺序:按类型匹配,如果有多个同类型bean,则按属性名(或字段名)作为bean名称进行匹配,如果还不行就需要用`@Qualifier`指定。- `@Resource`的装配顺序:先按指定的name(如果有)进行匹配,如果没有指定name,则按字段名或属性名作为bean名称进行匹配,如果还没有匹配到,则按类型进行匹配。 5. **其他区别**:-`@Autowired`支持`required`属性,可以设置为`@Autowired(required=false)`,表示允许注入的bean不存在(此时为null)。-`@Resource`可以通过`name`属性指定bean的名称,例如`@Resource(name="myBean")`。 下面我们通过示例代码来具体说明: **使用@Autowired的示例:** ```java@Servicepublic classMyService{//默认按类型注入@Autowiredprivate UserRepository userRepository;//当有多个实现时,使用@Qualifier指定bean名称@Autowired@Qualifier("adminService")privateAdminServiceadminService; }``` **使用@Resource的示例:** ```java@Servicepublic classMyService{//默认按名称注入(这里会查找名为userRepository的bean)@Resourceprivate UserRepository userRepository;//指定name属性,按名称注入@Resource(name="adminService")private AdminService adminService;} ```**总结区别:**|特性| @Autowired| @Resource| |--------------|--------------------------------|--------------------------------|| **来源**|Spring框架|Java标准(JSR-250)|| **默认方式** |按类型(byType)|按名称(byName)|| **指定名称** |需要配合@Qualifier|通过name属性指定|| **是否必须** |有required属性(默认为true)|没有required属性,但找不到会报错 || **适用范围**|仅Spring环境|任何支持Java EE的环境|因此,在Spring Boot项目中,两者都可以使用,但通常推荐使用`@Autowired`,因为它是Spring原生的。如果希望代码更具通用性(可能脱离Spring环境),则可以使用`@Resource`。[^1]:引用自关于Spring Boot@Autowired@Resource注解的区别联系的文章。[^2]:引用自【Springboot@Autowired@Resource的区别的文章。 [^3]:引用自线上工单引发的思考:Spring Boot@Autowired@Resource的区别的文章。 §§相关问题§§1.SpringBoot中,如何解决一个接口有多个实现类时的注入问题? 2. @Autowired@Resource注解在注入失败时分别会有什么表现? 3.除了@Autowired@ResourceSpring还有哪些依赖注入的方式? 4.为什么在Spring Boot项目中更推荐使用@Autowired?</think>### Spring Boot@Autowired@Resource注解的区别 在Spring Boot中,`@Autowired``@Resource`都是用于依赖注入的注解,但它们在来源、工作机制使用方式上有显著区别: #### 1. **注解来源不同** - **@Autowired** 是Spring框架特有的注解(`org.springframework.beans.factory.annotation`包),属于Spring生态的核心组件[^3]。 - **@Resource** 是Java标准注解(`javax.annotation`包),遵循JSR-250规范,不依赖Spring框架[^1][^3]。 #### 2. **默认注入方式不同** - **@Autowired** **默认按类型(byType)注入**。例如: ```java @Autowired private UserService userService; // 自动查找UserService类型的Bean ``` 若存在多个同类型Bean,需配合`@Qualifier`指定名称: ```java @Autowired @Qualifier("adminService") private UserService userService; ``` - **@Resource** **默认按名称(byName)注入**。例如: ```java @Resource private UserService userService; // 查找名为"userService"的Bean ``` 也可显式指定名称或类型: ```java @Resource(name = "adminService") // 按名称注入 @Resource(type = AdminService.class) // 按类型注入 ``` #### 3. **依赖处理机制不同** - **@Autowired** 支持`required`属性控制非强制依赖: ```java @Autowired(required = false) // 允许注入为null private OptionalService optionalService; ``` - **@Resource** 无`required`属性,注入失败会直接抛出异常[^2]。 #### 4. **适用场景差异** - **@Autowired** 适用于纯Spring项目,深度集成Spring特性(如`@Qualifier`、`@Primary`)[^3]。 - **@Resource** 跨框架兼容性更好(如Java EE容器),适合需要脱离Spring环境的场景[^1][^2]。 #### 5. **装配顺序对比** | 注解 | 装配顺序 | |--------------|-------------------------------------------------------------------------| | `@Autowired` | 1. 按类型 → 2. 按属性名 → 3. 需`@Qualifier`辅助 | | `@Resource` | 1. 按指定名称 → 2. 按默认属性名 → 3. 按类型(未指定名称时)[^2] | #### 总结建议 - 在**Spring Boot项目**中优先使用`@Autowired`,因其与Spring生态集成更紧密。 - 需要**跨框架兼容**时选择`@Resource`。 - 遇到**多实现类冲突**时: - `@Autowired`需配合`@Qualifier` - `@Resource`可直接指定`name`属性 > 示例代码说明: > 若`UserService`有`UserServiceImpl``AdminServiceImpl`两个实现类: > ```java > // @Autowired方案 > @Autowired @Qualifier("adminServiceImpl") > private UserService userService; > > // @Resource方案 > @Resource(name = "adminServiceImpl") > private UserService userService; > ``` [^1]: Springboot@Autowired@Resource注解的区别联系 [^2]: 【Springboot@Autowired@Resource的区别 [^3]: 线上工单引发的思考:Spring Boot@Autowired@Resource的区别
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Itfuture03

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

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

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

打赏作者

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

抵扣说明:

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

余额充值