@Autowired 和 @Resource 的区别

本文详细介绍了Spring框架中Bean的五种自动装配方式:byName、byType、constructor、no和autodetect,并深入探讨了@Autowired和@Resource注解的区别及应用场景。

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

spring有5种方式完成自动装配Bean

  1. byName:把与Bean的属性具有相同名字(或者ID)的其他Bean自动装配到Bean的对应属性中。如果没有,则不进行装配;
  2. byType:把与Bean的属性具有相同类型的其它Bean自动装配到Bean的对应属性中。如果没有,则不进行装配;
  3. constructor:将要注入的bean写在构造函数的参数中,也是byType方式;
  4. no:缺省情况下,自动配置是通过“ref”属性手动设定
  5. autodetect:首先尝试constructor进行自动装配。如果失败,再尝试使用byType进行自动装配(在spring3。0以后的版本就废弃了,不再合法了);

下面主要讲byType和byName2种方式


@ Autowired

  • 属于spring提供
  • 3种自动装配Bean形式

  1.@Autowired默认按类型byType匹配,自动装配Bean,可写在成员属性上,也可写在方法上

@Autowired
private ItemService itemService;

  2.@Autowired(required=false),默认依赖的对象必须存在,否则报错,如果允许null值,设置required属性为false

@Autowired(required=false)
private ItemService itemService;

  3.按名称装配Bean,与@Autowired组合使用,解决按类型匹配找到多个Bean的问题

@Autowired
@Qualifier("Bean的id名称")
private ItemService itemService;

@Resource

  • JSR-25O提供的,属于Java EE提供
  • 2种自动装配Bean形式

  1.默认按名称byName进行装配,默认使用成员属性的变量名,当找不到匹配的bean再按类型class装配和变量名无关了,之和变量名前面的类型有关,可写在成员属性上,也可写在方法上

@Resource
private ItemService itemService;

  2.可指定name属性,一般不用指定name属性,如果一旦指定name属性,如果按名称找不到,就不会再按类型装配了,所以不要写name好

@Resource(name="类名")
private ItemService itemService;

【@Autowired和@Resource的区别】

  • 如果配置了class类型一样的多个bean,这时就可采用@Resource的方式注解,因为它是按bean的id查找的,使用@Autowired就不行了,因为是按class类型查找的,但可结合@Qualifier(“Bean的id名称”)使用问题就解决了,否则出现该类型对应多个Bean,spring就不知道注入那个Bean了,就会报如下错误:
    这里写图片描述
  • 减少了与spring的耦合.推荐使用@Resource,但是我看别人编写的代码,大多都是用的@Autowired
  • 按类型转配,是指按变量名前面的变量类型查找Bean,如果有Bean的class类型与之匹配的类型,就能完成装配(并不是将变量名首字母变为大写去找对应的class,一开始本人就是这样认为的,因为我发现代码中使用@Autowired时变量名都是类名首字母变小写);按名称装配,是指变量名和Bean的id属性匹配

【总结】

  • 按类型装配,是指按变量名前面的变量类型查找Bean,如果有Bean的class类型与之匹配的类型,就能完成装配,此种方法,完全可以不用写id属性(并不是将变量名首字母变为大写去找对应的class,一开始本人就是这样认为的,因为我发现代码中使用@Autowired时变量名都是类名首字母变小写)
  • 按名称装配,是指变量名和Bean的id属性匹配,所有的bean都要写class,相当于id名称相当于实例化类的变量名,而类就是class的属性,所以虽说按类型匹配,但是还要写class的,否则报如下错误
  • 这里写图片描述

利用半天的时间,各种试,改id改属性名,去类去id,终于搞明白它俩的区别了,虽然时间长点,但通过各种尝试,这两个东东算是弄明白了

### Spring 中 `@Autowired` 与 `@Resource` 的区别及其使用场景 #### 主要区别 1. **来源不同** - `@Autowired` 是由 Spring 提供的注解,主要用于 Spring 容器中的依赖注入[^1]。 - `@Resource` 则是由 JDK 提供的标准注解,遵循 JSR-250 规范,适用于任何支持该规范的 Java 容器[^4]。 2. **默认注入方式** - `@Autowired` 默认按照类型 (`ByType`) 进行匹配并完成 Bean 的注入。如果存在多个相同类型的 Bean,则会抛出异常。 - `@Resource` 默认按照名称 (`ByName`) 进行匹配。如果没有找到对应的名称,则退而求其次按类型进行匹配。 3. **解决多实现类的情况** - 当一个接口有多个实现类时: - 对于 `@Autowired`,可以配合 `@Qualifier` 明确指定需要注入的具体 Bean 名称。 - 而对于 `@Resource`,可以直接通过其属性 `name` 来显式指定目标 Bean 的名称。 4. **灵活性与控制力** - 在 Spring 应用开发中,推荐优先使用 `@Autowired`,因为它更加贴合 Spring 的设计理念,并提供诸如懒加载(`lazy-init=true`)以及更精细的错误处理机制等功能[^2]。 #### 使用场景分析 - 如果项目完全基于 Spring 或者主要采用 Spring 技术栈构建,则应首选 `@Autowired` 实现依赖注入操作。 - 若处于混合技术环境或者希望保持代码独立性(不绑定特定框架),那么可以选择更为通用的 `@Resource` 注解。 ```java // 示例:使用 @Autowired 配合 @Qualifier 处理多实现情况 @Component public class ExampleService { @Autowired @Qualifier("specificImplementation") private MyInterface myInstance; } // 示例:使用 @Resource 指定具体 bean name @Component public class AnotherExampleService { @Resource(name="anotherSpecificImplementation") private MyInterface anotherMyInstance; } ```
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值