@Resource 是 Java EE(也称为 Jakarta EE)中的注解,但也可以用于 Spring 框架中来实现依赖注入。它主要用于标识依赖对象,并将该对象注入到类的字段、方法或构造函数中。
与 @Autowired 的区别
在 Spring 中,@Resource 和 @Autowired 都可以用来实现依赖注入,但它们有以下区别:
@Resource来自 Java EE:@Resource注解源自 Java EE 规范(javax.annotation.Resource),它遵循 Java 的标准,兼容多个依赖注入框架。- 它使用 by name 的方式进行注入。即优先按名称(通过字段名或属性名)查找 Bean 进行注入,如果找不到与名称匹配的 Bean,再根据类型查找。
@Autowired来自 Spring:@Autowired是 Spring 框架特有的注解,默认使用 by type 的方式进行注入,按类型匹配所需的依赖对象。- 如果需要按名称注入,可以配合
@Qualifier注解使用。
@Resource 的使用
@Resource 注解可以应用在字段、setter 方法、或构造函数上。它可以接受两个属性:
name:用于指定注入的 Bean 的名称。type:用于指定注入的 Bean 的类型。
示例
- 按名称注入(默认方式):
import javax.annotation.Resource; |
在上面的例子中,Spring 将根据字段名 myRepository 去 Spring 容器中查找同名的 Bean,并注入它。
- 使用
name属性指定注入的 Bean 名称:
import javax.annotation.Resource; |
在此示例中,@Resource(name = "customRepository") 明确指定了要注入的 Bean 的名称为 customRepository,Spring 会根据这个名称来注入相应的 Bean。
- 使用
type属性按类型注入:
import javax.annotation.Resource; |
这里使用 type 属性,明确按类型 MyRepository 进行注入,Spring 会根据类型匹配相应的 Bean。
@Resource 的工作流程
- 按名称匹配:
@Resource首先根据属性名查找与之匹配的 Bean。 - 按类型匹配:如果没有找到与名称匹配的 Bean,
@Resource则根据类型进行查找。 - 注入:如果找到匹配的 Bean,则注入该 Bean;如果找不到,且没有设置
required = false,则会抛出异常。
何时使用 @Resource
- 兼容性:如果你希望你的代码能够在 Spring 和 Java EE 之间保持较好的兼容性,
@Resource是一个更标准的选择。 - 按名称注入:如果你需要通过名称来指定依赖,
@Resource可能会更加方便,因为它默认按名称注入,而不需要像@Autowired那样配合@Qualifier使用。
总结
@Resource是 Java EE 的注解,用于依赖注入,Spring 也支持该注解。- 默认按名称注入,如果没有找到名称匹配的 Bean,才按类型注入。
- 适用场景:当你需要按名称注入或者希望代码兼容 Java EE 标准时,可以使用
@Resource。
如果你还有其他问题或需要更多示例,随时告诉我!







