使用 @Resource
进行注入
@Resource
Spring 还支持通过在字段或 bean 属性 setter 方法上使用 JSR-250 @Resource
注解(jakarta.annotation.Resource
)进行注入。这是 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;
}
}
这一行注入了一个
@Resource
。
class SimpleMovieLister {
@Resource(name="myMovieFinder") 1
private lateinit var movieFinder:MovieFinder
}
这一行注入了一个
@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
}
注解中提供的名称由 CommonAnnotationBeanPostProcessor
所知的 ApplicationContext
解析为 bean 名称。如果您显式配置了 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() {
}
// ...
}
context
字段是基于已知可解析的依赖类型ApplicationContext
注入的。
class MovieRecommender {
@Resource
private lateinit var customerPreferenceDao: CustomerPreferenceDao
@Resource
private lateinit var context: ApplicationContext 1
// ...
}
context
字段是基于已知可解析的依赖类型ApplicationContext
注入的。