Injection with @Resource
Spring 还支持在字段或 Bean 属性 setter 方法上使用 JSR-250 @Resource
注解(jakarta.annotation.Resource
)进行注入。这是 Jakarta EE 中的常见模式:例如,在 JSF 管理的 Bean 和 JAX-WS 端点中。Spring 也支持此模式的 Spring 管理对象。
@Resource
获取一个名称属性。默认情况下,Spring 将该值解释为要注入的 Bean 名称。换句话说,它遵循按名称语义,如下面的示例所示:
- Java
-
public class SimpleMovieLister { private MovieFinder movieFinder; @Resource(name="myMovieFinder") (1) public void setMovieFinder(MovieFinder movieFinder) { this.movieFinder = movieFinder; } }
1 | 此行注入了一个 @Resource 。
|
2 | 此行注入了一个 @Resource 。 |
如果没有明确指定名称,则默认名称将从字段名称或 setter 方法派生。对于字段,它获取字段名称。对于 setter 方法,它获取 Bean 属性名称。以下示例将在其 setter 方法中注入名为 movieFinder
的 Bean:
-
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
}
使用注释提供的名称被 |
在没有明确指定名称的情况下独家使用 @Resource
时,与 @Autowired
类似,@Resource
将查找主类型匹配,而不是特定命名的 Bean,并解析众所周知的可解析依赖项:BeanFactory
、ApplicationContext
、ResourceLoader
、ApplicationEventPublisher
和 MessageSource
接口。
因此,在以下示例中,customerPreferenceDao
字段首先查找名为“customerPreferenceDao”的 bean,然后回退到类型`CustomerPreferenceDao` 的主类型匹配:
- Java
-
public class MovieRecommender { @Resource private CustomerPreferenceDao customerPreferenceDao; @Resource private ApplicationContext context; (1) public MovieRecommender() { } // ... }
1 | 根据已知可解析依赖项类型:ApplicationContext ,注入 context 字段。
|
2 | 根据已知可解析依赖项类型:ApplicationContext ,注入 context 字段。 |