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;@Resourcepublic 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 {@Resourceprivate CustomerPreferenceDao customerPreferenceDao;// 这个 context 字段是根据已知的可解决的依赖关系类型注入的// 这里就不是根据 context 名称注入的了,而是根据类型注入的@Resourceprivate ApplicationContext context;public MovieRecommender() {}// ...}
总结
@Resource注解主要以 bean 名称去选择依赖项,如果没有找到这回退到使用 bean 类型去选择依赖项
