使用 @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,並解析眾所周知的可解析依賴項: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 進行注入的。 |