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