6.9.7 @Resource
Spring还支持在字段或bean属性setter方法上使用JSR-250 @Resource注释进行注入。 这是Java EE 5和6中的常见模式,例如在JSF 1.2管理的bean或JAX-WS 2.0端点中。 对于由Spring管理的对象也支持这种模式。
@Resource采用name属性,默认情况下,Spring将该值解释为要注入的bean名称。 换句话说,它遵循by-name语义,如本例所示:
public class SimpleMovieLister { private MovieFinder movieFinder; @Resource(name="myMovieFinder") 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; } }
借助CommonAnnotationBeanPostProcessor识别的ApplicationContext,该注解提供的名称会解析为bean名称。如果您明确配置Spring的SimpleJndiBeanFactory,则可以通过JNDI解析名称。但是,建议您依赖此默认行为,仅仅使用Spring的JNDI查找功能来维持间接级别。
在没有指定明确的名称且类似于@Autowired的@Resource用法的特殊情况下,@ Resource寻找主要类型匹配而不是特定名称的bean,并解析众所周知的可解析依赖项:BeanFactory,ApplicationContext,ResourceLoader,ApplicationEventPublisher, 和MessageSource接口。
因此,在以下示例中,customerPreferenceDao字段首先查找名为customerPreferenceDao的bean,然后回到CustomerPreferenceDao类型的主类型匹配。 基于已知的可解析依赖类型ApplicationContext注入“context”字段。
public class MovieRecommender { @Resource private CustomerPreferenceDao customerPreferenceDao; @Resource private ApplicationContext context; public MovieRecommender() { } // ... }