使用 @Resource 進行注入

Spring 也支援使用 JSR-250 @Resource 註解(jakarta.annotation.Resource)在欄位或 bean 屬性 setter 方法上進行注入。這是 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 進行注入的。