跳到主要内容

使用 @Resource 进行注入

ChatGPT-4o 中英对照 Injection with @Resource Injection with @Resource

Spring 还支持通过在字段或 bean 属性 setter 方法上使用 JSR-250 @Resource 注解(jakarta.annotation.Resource)进行注入。这是 Jakarta EE 中的常见模式:例如,在 JSF 管理的 bean 和 JAX-WS 端点中。Spring 也支持这种用于 Spring 管理对象的模式。

@Resource 接受一个 name 属性。默认情况下,Spring 将该值解释为要注入的 bean 名称。换句话说,它遵循按名称的语义,如以下示例所示:

public class SimpleMovieLister {

private MovieFinder movieFinder;

@Resource(name="myMovieFinder") 1
public void setMovieFinder(MovieFinder movieFinder) {
this.movieFinder = movieFinder;
}
}
java
  • 这一行注入了一个 @Resource

如果没有明确指定名称,则默认名称来自字段名称或 setter 方法。在字段的情况下,它采用字段名称。在 setter 方法的情况下,它采用 bean 属性名称。以下示例将把名为 movieFinder 的 bean 注入到其 setter 方法中:

public class SimpleMovieLister {

private MovieFinder movieFinder;

@Resource
public void setMovieFinder(MovieFinder movieFinder) {
this.movieFinder = movieFinder;
}
}
java
备注

注解中提供的名称由 CommonAnnotationBeanPostProcessor 所知的 ApplicationContext 解析为 bean 名称。如果您显式配置了 Spring 的 SimpleJndiBeanFactory,则可以通过 JNDI 解析这些名称。然而,我们建议您依赖默认行为并使用 Spring 的 JNDI 查找功能,以保持间接层次。

在没有指定显式名称的情况下使用 @Resource 的特殊情况下,与 @Autowired 类似,@Resource 会找到一个主要类型匹配,而不是特定命名的 bean,并解析众所周知的可解析依赖项:BeanFactoryApplicationContextResourceLoaderApplicationEventPublisherMessageSource 接口。

因此,在下面的示例中,customerPreferenceDao 字段首先查找名为 "customerPreferenceDao" 的 bean,然后退回到类型 CustomerPreferenceDao 的主要类型匹配:

public class MovieRecommender {

@Resource
private CustomerPreferenceDao customerPreferenceDao;

@Resource
private ApplicationContext context; 1

public MovieRecommender() {
}

// ...
}
java
  • context 字段是基于已知可解析的依赖类型 ApplicationContext 注入的。