@Resource
和 @Autowired
都是 Java 框架中用于注入依赖的注解。尽管它们在功能上相似,但仍有一些区别:
@Resource
- 来自 Java 的
javax.annotation
包(需要 Java EE 支持)。 - 支持
name
和type
属性,用于在注入时确定具体的依赖项。@Resource(name = "beanName")
:通过指定 bean 名称注入。@Resource(type = SomeClass.class)
:通过指定 bean 类型注入。
- 默认按名称注入(优先级高于类型)。
@Autowired
- Spring 特有的注解,位于
org.springframework.beans.factory.annotation
包中。 - 默认按类型注入(优先级高于名称)。
- 可用于构造器、字段、setter 方法和普通方法。
- 可搭配
@Qualifier
指定具体的 bean 名称。
区别
- 注入策略:
@Resource
默认按名称注入,而@Autowired
默认按类型注入。 - 可用性:
@Resource
属于 Java EE 标准,需额外配置;@Autowired
则是 Spring 原生注解,无需其他配置。 - 细化注入:
@Autowired
配合@Qualifier
使用时,更灵活细致;@Resource
相对简单直接。
在实际项目中选择注解时,可以根据项目需求和技术栈来决定。
哪个更常用
在 Spring 框架中,@Autowired
通常更常用,因为它是 Spring 框架的原生注解,使用起来方便且灵活。它的主要优势在于:
-
灵活性:
@Autowired
可用于构造器、字段、setter 方法以及普通方法,使得注入依赖的方式更加灵活。 -
类型优先:默认按类型注入,可配合
@Qualifier
按名称限定特定的 bean,支持类型安全。 -
标准化:
@Autowired
适用于任何 Spring 应用程序,直接提供与 Spring 框架深度集成的功能,无需额外配置。
相比之下,@Resource
在特定情况下使用较多,主要是在需要更精确控制的注入时。例如:
-
特定的名称注入:
@Resource
默认按名称注入,适用于需要明确名称的 bean 注入的场景。 -
Java EE 集成:在 Java EE 环境中,它是一个标准注解,可以在更广泛的 Java 环境中使用。
因此,在 Spring 开发中 @Autowired
更为常用,但根据具体项目需求,可以灵活选择 @Resource
。