Spring 还支持通过在字段或 Bean 属性设置方法上使用 JSR-250 @Resource
注解(javax.annotation.Resource
)进行注入。这是 Java EE 中的一种常见模式:例如,在 JSF 管理的 Bean 和 JAX-WS 端点。Spring 对 Spring 管理的对象也支持这种模式。
@Resource
需要一个 name 属性。默认情况下,Spring 将该值解释为要注入的 Bean 名称。换句话说,它遵循按名称的语义,正如下面的例子所展示的:
public class SimpleMovieLister {
private MovieFinder movieFinder;
@Resource(name="myMovieFinder") // 这里使用 @Resource 注解注入一个依赖项
public void setMovieFinder(MovieFinder movieFinder) {
this.movieFinder = movieFinder;
}
}
如果没有明确指定名称,默认的名称来自于字段名或 setter 方法。如果是一个字段,它采用字段名。如果是 setter 方法,则采用 Bean 的属性名。下面的例子将把名为 movieFinder 的 bean 注入它的 setter 方法中。
public class SimpleMovieLister {
private MovieFinder movieFinder;
@Resource
public void setMovieFinder(MovieFinder movieFinder) {
this.movieFinder = movieFinder;
}
}
:::tips 与注解一起提供的名称被 CommonAnnotationBeanPostProcessor 所知道的 ApplicationContext 解析为一个 Bean 名称。如果你明确地配置了 Spring 的 SimpleJndiBeanFactory,这些名字可以通过 JNDI 来解析。然而,我们建议你依靠默认行为,并使用 Spring 的 JNDI 查询功能,以保持间接性的水平。 :::
在没有明确指定名称的 @Resource
使用的特殊情况下,与 @Autowired
类似,@Resource
找到一个主要的类型匹配,而不是一个特定的命名的 Bean,并解析众所周知的可解析的依赖关系:BeanFactory、ApplicationContext、ResourceLoader、ApplicationEventPublisher 和 MessageSource 接口。
因此,在下面的例子中,customerPreferenceDao
字段首先寻找一个名为 customerPreferenceDao
的 bean,然后回到 CustomerPreferenceDao 类型的主类型匹配。
public class MovieRecommender {
@Resource
private CustomerPreferenceDao customerPreferenceDao;
// 这个 context 字段是根据已知的可解决的依赖关系类型注入的
// 这里就不是根据 context 名称注入的了,而是根据类型注入的
@Resource
private ApplicationContext context;
public MovieRecommender() {
}
// ...
}
总结
@Resource
注解主要以 bean 名称去选择依赖项,如果没有找到这回退到使用 bean 类型去选择依赖项