@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 的类型。

示例

  1. 按名称注入(默认方式)
import javax.annotation.Resource;

public class MyService {

@Resource
private MyRepository myRepository; // 按名称注入

public void performAction() {
myRepository.save();
}
}

在上面的例子中,Spring 将根据字段名 myRepository 去 Spring 容器中查找同名的 Bean,并注入它。

  1. 使用 name 属性指定注入的 Bean 名称
import javax.annotation.Resource;

public class MyService {

@Resource(name = "customRepository")
private MyRepository myRepository; // 指定 Bean 名称注入

public void performAction() {
myRepository.save();
}
}

在此示例中,@Resource(name = "customRepository") 明确指定了要注入的 Bean 的名称为 customRepository,Spring 会根据这个名称来注入相应的 Bean。

  1. 使用 type 属性按类型注入
import javax.annotation.Resource;

public class MyService {

@Resource(type = MyRepository.class)
private MyRepository myRepository; // 按类型注入

public void performAction() {
myRepository.save();
}
}

这里使用 type 属性,明确按类型 MyRepository 进行注入,Spring 会根据类型匹配相应的 Bean。

@Resource 的工作流程

  1. 按名称匹配@Resource 首先根据属性名查找与之匹配的 Bean。
  2. 按类型匹配:如果没有找到与名称匹配的 Bean,@Resource 则根据类型进行查找。
  3. 注入:如果找到匹配的 Bean,则注入该 Bean;如果找不到,且没有设置 required = false,则会抛出异常。

何时使用 @Resource

  • 兼容性:如果你希望你的代码能够在 Spring 和 Java EE 之间保持较好的兼容性,@Resource 是一个更标准的选择。
  • 按名称注入:如果你需要通过名称来指定依赖,@Resource 可能会更加方便,因为它默认按名称注入,而不需要像 @Autowired 那样配合 @Qualifier 使用。

总结

  • @Resource 是 Java EE 的注解,用于依赖注入,Spring 也支持该注解。
  • 默认按名称注入,如果没有找到名称匹配的 Bean,才按类型注入。
  • 适用场景:当你需要按名称注入或者希望代码兼容 Java EE 标准时,可以使用 @Resource

如果你还有其他问题或需要更多示例,随时告诉我!