使用 @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