使用 @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 进行注入的。 |