使用 @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,並解析眾所周知的可解析依賴項:BeanFactory、ApplicationContext、ResourceLoader、ApplicationEventPublisher 和 MessageSource 介面。
因此,在以下示例中,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 進行注入。 |