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”)
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;
}
}
在没有指定显式名称的@Resource使用的exclusive情况下,与@Autowired类似,@Resource会找到一个主类型匹配,而不是特定的命名bean,并解析众所周知的可解析依赖项:BeanFactory、ApplicationContext、ResourceLoader、ApplicationEventPublisher和MessageSource接口。
因此,在下面的例子中,customerPreferenceDao字段首先查找名为“customerPreferenceDao”的bean,然后返回到customerPreferenceDao类型的主类型匹配:
public class MovieRecommender {
@Resource
private CustomerPreferenceDao customerPreferenceDao;
@Resource
private ApplicationContext context;
public MovieRecommender() {
}
}