使用 @Resource 進行注入

Spring 也支援透過在欄位或 Bean 屬性 setter 方法上使用 JSR-250 @Resource 註解 (jakarta.annotation.Resource) 進行注入。這在 Jakarta EE 中是一種常見模式:例如,在 JSF 管理的 Bean 和 JAX-WS 端點中。Spring 也支援這種模式用於 Spring 管理的物件。

@Resource 接受一個 name 屬性。預設情況下,Spring 將該值解釋為要注入的 Bean 名稱。換句話說,它遵循按名稱語義,如下例所示:

  • Java

  • Kotlin

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 屬性名稱。以下示例將把名為 movieFinder 的 Bean 注入其 setter 方法:

  • 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 的 SimpleJndiBeanFactory,名稱可以透過 JNDI 解析。但是,我們建議您依賴預設行為,並使用 Spring 的 JNDI 查詢功能來保持間接性。

在未明確指定名稱的 @Resource 獨佔使用情況下,類似於 @Autowired@Resource 會查詢主要型別匹配而不是特定命名 Bean,並解析眾所周知的可解析依賴項:BeanFactoryApplicationContextResourceLoaderApplicationEventPublisherMessageSource 介面。

因此,在以下示例中,customerPreferenceDao 欄位首先查詢名為 "customerPreferenceDao" 的 Bean,然後回退到 CustomerPreferenceDao 型別的主要型別匹配。

  • Java

  • Kotlin

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 進行注入。
© . This site is unofficial and not affiliated with VMware.