SpringBoot中@Autowired和@Resource的区别

本文比较了SpringBoot中的@Autowired和@Resource两种依赖注入注解,阐述了它们的来源、自动装配机制、适用场景和区别,强调了在处理多类型Bean时的注意事项。

       在我们的开发项目中,这两个注解是非常常见的,刚学习springboot时,我们可能都是用@Autowired注解,不行就换@Resource,再不行就请求大佬。我们知道这两个注解都可以实现自动装配,但是他们真的就是只是名字不一样功能一样吗?下面我们来一探究竟

1.@Autowired与@Resource分别来自哪里?

        我们先来看@Autowired

        可以清晰看到,@Autowired注解是来自spring的,那@Resource是不是也是spring呢?我们继续往下看

         我们可以发现@Resource并不是来着spring,而是JSR-250,java自己的

2.他们真就是名字不一样作用一样吗?

     我们直接上实例,还是一样先看@Autowired

1.我们先定义一个接口,接口名TestAuto

2.我们定义一个实现类TestServiceImpl

3.我们controller里面使用@Autowired 

4.测试运行

可以发现成功,没毛病。

紧接着注解更换成@Resource

我们继续上面的步骤

       我们发现,一个接口对应一个业务,@Autowired和@Resource都可以成功实现,好像一点问题都没有,那如果一个接口对应多个业务,结果还是这样吗?我们继续探索

5.现在我们多加一个实现类TestTwoServiceImpl

6.我们到controller继续@Autowired

       我们发现已经爆红了,运行肯定是出错的,鼠标移上去我们发现他说不能自动装配,发现两个TestAuo类型,意思就是不知道装谁,不知道调那个方法了。

解决办法:我们可以使用@Primay注解 哪一个是优先注入,或使用@Qualifier名字指定一需要注入哪个bean

例如:给TestServiceImpl加个别名

然后在controller中使用@Qualifier来指定一下

现在跑起来是没有问题的,我们来测试一下

        欧克了可以跑起来,我们发现@Autowired一开始是默认按照类型去注入,如果是只有一个类型那当然不会报错,现在是两个类型,他就不知道怎么办了,就爆红提示我们要解决一下,我们用了@Qualifier名字指定一下,告诉他要注入哪个bean。

       @Autowired 默认按照类型(byType)进行自动装配,如果有多个相同类型的 Bean,则需要通过指定 Bean 的名称或者使用 @Qualifier 注解来指定具体的 Bean

我们换@Resource注解在试一下,看看是不是还是和@Autowired一样呢?

1.首先回到之前,把service别名,和@Qualifier全部去掉

 我们发现他不爆红,不爆红是不是可以运行?是不是就没问题呢?我们直接启动

ok报错了,一大串什么意思呢?

解析:@Resource 默认按照名称(byName)进行自动装配,如果没有指定 name 属性,则默认使用被注解字段或方法的名称作为 Bean 的名称进行匹配,找不到又会按照类型去找

       如果使用时,没有指定,那么就是按照默认byName,默认去找testAuto这玩意,但是怎么可能找到呢,因为我们刚刚注入bean的是,TestServiceImpl和TestTwoServiceImpl,他们的service是没有指定别名的,默认别名是驼峰命名法。testAuto!=testServiceImpl&&testAuto!=testTwoServiceImpl,所以想找到是不可能的,那他既然通过名字找不到难道就不找吗?不对,他会按照类型继续找,然后就发现TestServiceImpl和TestTwoServiceImpl,两个同样的类型,所以运行报错咯。

解决办法:

一样可以设置名字,刚刚上面我们说了,会默认按照名字去找bean,我们可以给其中一个service设置名字

运行发现是ok的,所以证实我们想法是对的。

当然下面这样写也是ok的,在@service注解就不需要名字了

相信到这里,大家应该知道他们的区别了吧

3.总结

  1. 来源不同:@Autowired 是 Spring 框架提供的注解,而 @Resource 是 JSR-250 规范中定义的注解。

  2. 自动装配方式不同:@Autowired 默认按照类型(byType)进行自动装配,如果有多个相同类型的 Bean,则需要通过指定 Bean 的名称或者使用 @Qualifier 注解来指定具体的 Bean;而 @Resource 默认按照名称(byName)进行自动装配,如果没有指定 name 属性,则默认使用被注解字段或方法的名称作为 Bean 的名称进行匹配,如果找不到名称匹配的实例,则会按照类型来进行注入。

  3. 支持的依赖注入类型不同:@Autowired 只支持 Spring 框架中的依赖注入,而 @Resource 支持 JNDI、EJB 和 Spring 框架中的依赖注入。

  4. 使用时机不同:@Autowired 适用于 Spring 框架中的依赖注入,而 @Resource 适用于 Java EE 环境(如 Web 应用程序)中的依赖注入。

     综上所述,两个注解都可以实现依赖注入,但是在使用时需要根据具体的场景和需求选择合适的注解。本文是自己在学习中的一些理解,如果有错大家可以指出来,谢谢~

<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区别
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值