一:来源不同
@Resouce是JavaEE的一个包下的,可以跨框架使用。而@Autowired是来源于Spring框架中的,脱离Spring时候不可用。
二:注解参数
@Resource
- 提供了两个主要属性:
- name: 按名称注入,默认值是字段名。
type
: 按类型注入,默认值是字段的类型。
- 如果同时指定了
name
和type
,优先使用name
。
例子:
-
按名称注入:
@Resource(name = "specificService") private SomeService someService;
-
按类型注入:
@Resource(type = SomeService.class) private SomeService someService;
-
不指定参数(默认按名称,找不到时按类型):
@Resource private SomeService someService;
@Autowired
- 提供了一个可选的属性:
required
: 默认为true
,表示必须找到匹配的依赖项。如果设置为false
,找不到依赖时不会抛出异常,而是将属性设为null
。
- 通常配合
@Qualifier
注解使用,以指定按名称注入的候选项。
三:注入方式
@Resource
主要基于按名称注入,如果找不到匹配的名称,才会尝试类型
@Autowired
默认基于 按类型注入,当有多个候选项时,可以通过 @Qualifier
指定名称
四:依赖解析机制
@Resource
- 使用 JNDI 或 Java EE 容器提供的依赖注入机制,优先以名称解析依赖。
- 受 Spring 容器支持,但本质上更通用,不依赖于 Spring 特定功能
@Autowried
- 由 Spring 容器管理,支持更复杂的依赖解析,如构造器注入、字段注入、方法注入。
- 支持 Spring 的高级功能,例如循环依赖解析、
ApplicationContext
感知等。
五:使用场景
@Resource
推荐在需要显式指定注入名称,或者代码需与 Java EE/Jakarta EE 标准兼容时使用。
@Resource(name = "myService")
private MyService service;
@Autowired
推荐在全 Spring 项目中使用,尤其是需要利用按类型注入的优势或 Spring 特定功能时
@Autowired
private MyService service;
@Autowired(required = false)
private Optional<OtherService> optionalService;