使用@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
。
1 |
class SimpleMovieLister {
@Resource(name="myMovieFinder") (1)
private lateinit var movieFinder:MovieFinder
}
@Resource
。
1 |
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 进行注入。 |