使用@Resource进行注入
@Resource
Spring还支持通过在字段或bean属性设置方法上使用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;
}
}
这一行注入了
@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,如果找不到,则会退而采用基本类型匹配(primary type match)来查找类型为 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。