Injection with @Resource

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

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

Java
public class SimpleMovieLister {

	private MovieFinder movieFinder;

	@Resource(name="myMovieFinder") (1)
	public void setMovieFinder(MovieFinder movieFinder) {
		this.movieFinder = movieFinder;
	}
}
1 此行注入了一个 @Resource
Kotlin
class SimpleMovieLister {

	@Resource(name="myMovieFinder") (1)
	private lateinit var movieFinder:MovieFinder
}
2 此行注入了一个 @Resource

如果没有明确指定名称,则默认名称将从字段名称或 setter 方法派生。对于字段,它获取字段名称。对于 setter 方法,它获取 Bean 属性名称。以下示例将在其 setter 方法中注入名为 movieFinder 的 Bean:

  • Java

  • Kotlin

public class SimpleMovieLister {

	private MovieFinder movieFinder;

	@Resource
	public void setMovieFinder(MovieFinder movieFinder) {
		this.movieFinder = movieFinder;
	}
}
class SimpleMovieLister {

	@set:Resource
	private lateinit var movieFinder: MovieFinder

}

使用注释提供的名称被 ApplicationContext 解析为一个 bean 名称,CommonAnnotationBeanPostProcessor 了解该名称。如果您显式配置 Spring 的https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/jndi/support/SimpleJndiBeanFactory.html[SimpleJndiBeanFactory],这些名称可以通过 JNDI 解析。但是,我们建议您依赖默认行为并使用 Spring 的 JNDI 查找功能来保留间接级别。

在没有明确指定名称的情况下独家使用 @Resource 时,与 @Autowired 类似,@Resource 将查找主类型匹配,而不是特定命名的 Bean,并解析众所周知的可解析依赖项:BeanFactoryApplicationContextResourceLoaderApplicationEventPublisherMessageSource 接口。

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

Java
public class MovieRecommender {

	@Resource
	private CustomerPreferenceDao customerPreferenceDao;

	@Resource
	private ApplicationContext context; (1)

	public MovieRecommender() {
	}

	// ...
}
1 根据已知可解析依赖项类型:ApplicationContext,注入 context 字段。
Kotlin
class MovieRecommender {

	@Resource
	private lateinit var customerPreferenceDao: CustomerPreferenceDao


	@Resource
	private lateinit var context: ApplicationContext (1)

	// ...
}
2 根据已知可解析依赖项类型:ApplicationContext,注入 context 字段。