|
对于最新稳定版本,请使用 Spring Framework 7.0.6! |
使用 @Resource 进行注入
Spring 还支持在字段或 Bean 属性的 setter 方法上使用 JSR-250 的 @Resource 注解(jakarta.annotation.Resource)进行注入。
这是 Jakarta EE 中的常见模式:例如,在 JSF 管理的 Bean 和 JAX-WS 端点中。
Spring 也为 Spring 管理的对象支持这种模式。
@Resource 带有一个 name 属性。默认情况下,Spring 将该值解释为要注入的 bean 名称。换句话说,它遵循按名称(by-name)的语义,如下例所示:
-
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知晓该ApplicationContext。
如果您显式配置 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 进行注入。 |