Spring 还支持通过在字段或 Bean 属性设置方法上使用 JSR-250 @Resource注解(javax.annotation.Resource)进行注入。这是 Java EE 中的一种常见模式:例如,在 JSF 管理的 Bean 和 JAX-WS 端点。Spring 对 Spring 管理的对象也支持这种模式。

@Resource 需要一个 name 属性。默认情况下,Spring 将该值解释为要注入的 Bean 名称。换句话说,它遵循按名称的语义,正如下面的例子所展示的:

  1. public class SimpleMovieLister {
  2. private MovieFinder movieFinder;
  3. @Resource(name="myMovieFinder") // 这里使用 @Resource 注解注入一个依赖项
  4. public void setMovieFinder(MovieFinder movieFinder) {
  5. this.movieFinder = movieFinder;
  6. }
  7. }

如果没有明确指定名称,默认的名称来自于字段名或 setter 方法。如果是一个字段,它采用字段名。如果是 setter 方法,则采用 Bean 的属性名。下面的例子将把名为 movieFinder 的 bean 注入它的 setter 方法中。

  1. public class SimpleMovieLister {
  2. private MovieFinder movieFinder;
  3. @Resource
  4. public void setMovieFinder(MovieFinder movieFinder) {
  5. this.movieFinder = movieFinder;
  6. }
  7. }

:::tips 与注解一起提供的名称被 CommonAnnotationBeanPostProcessor 所知道的 ApplicationContext 解析为一个 Bean 名称。如果你明确地配置了 Spring 的 SimpleJndiBeanFactory,这些名字可以通过 JNDI 来解析。然而,我们建议你依靠默认行为,并使用 Spring 的 JNDI 查询功能,以保持间接性的水平。 :::

在没有明确指定名称的 @Resource使用的特殊情况下,与 @Autowired类似,@Resource找到一个主要的类型匹配,而不是一个特定的命名的 Bean,并解析众所周知的可解析的依赖关系:BeanFactory、ApplicationContext、ResourceLoader、ApplicationEventPublisher 和 MessageSource 接口。

因此,在下面的例子中,customerPreferenceDao 字段首先寻找一个名为 customerPreferenceDao的 bean,然后回到 CustomerPreferenceDao 类型的主类型匹配。

  1. public class MovieRecommender {
  2. @Resource
  3. private CustomerPreferenceDao customerPreferenceDao;
  4. // 这个 context 字段是根据已知的可解决的依赖关系类型注入的
  5. // 这里就不是根据 context 名称注入的了,而是根据类型注入的
  6. @Resource
  7. private ApplicationContext context;
  8. public MovieRecommender() {
  9. }
  10. // ...
  11. }

总结

@Resource注解主要以 bean 名称去选择依赖项,如果没有找到这回退到使用 bean 类型去选择依赖项