对于最新的稳定版本,请使用 Spring Framework 7.0.6!spring-doc.cadn.net.cn

使用 @Resource 进行注入

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

@Resource 需要一个 name 属性。默认情况下,Spring 会将该值解释为要注入的 bean 名称。换句话说,它遵循按名称语义,如下面的示例所示:spring-doc.cadn.net.cn

public class SimpleMovieLister {

	private MovieFinder movieFinder;

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

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

如果没有显式指定名称,则默认名称将从字段名或setter方法派生。如果是字段,则使用字段名。如果是setter方法,则使用bean属性名。下面的示例将在它的setter方法中注入名为movieFinder的bean:spring-doc.cadn.net.cn

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 的 SimpleJndiBeanFactory ,可以通过 JNDI 解析名称。 但是,我们建议您依赖默认行为,并使用 Spring 的 JNDI 查找功能以保持间接层次。

在仅使用 @Resource 且未显式指定名称的特殊情况下,类似于 @Autowired@Resource 会查找主要类型匹配而不是特定命名的 Bean,并解决一些已知的可解析依赖项: BeanFactoryApplicationContextResourceLoaderApplicationEventPublisherMessageSource 接口。spring-doc.cadn.net.cn

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

public class MovieRecommender {

	@Resource
	private CustomerPreferenceDao customerPreferenceDao;

	@Resource
	private ApplicationContext context; (1)

	public MovieRecommender() {
	}

	// ...
}
1 context 字段根据已知的可解析依赖类型进行注入: ApplicationContext
class MovieRecommender {

	@Resource
	private lateinit var customerPreferenceDao: CustomerPreferenceDao


	@Resource
	private lateinit var context: ApplicationContext (1)

	// ...
}
1 context 字段根据已知的可解析依赖类型进行注入: ApplicationContext