使用@Resource进行注入

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

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

  • Java

  • Kotlin

public class SimpleMovieLister {

	private MovieFinder movieFinder;

	@Resource(name="myMovieFinder") (1)
	public void setMovieFinder(MovieFinder movieFinder) {
		this.movieFinder = movieFinder;
	}
}
@Resource
1
class SimpleMovieLister {

	@Resource(name="myMovieFinder") (1)
	private lateinit var movieFinder:MovieFinder
}
@Resource
1
movieFinder的bean注入到其setter方法中:

  • Java

  • Kotlin

public class SimpleMovieLister {

	private MovieFinder movieFinder;

	@Resource
	public void setMovieFinder(MovieFinder movieFinder) {
		this.movieFinder = movieFinder;
	}
}
class SimpleMovieLister {

	@set:Resource
	private lateinit var movieFinder: MovieFinder

}
通过注解提供的名称由ApplicationContext解析为bean名称,CommonAnnotationBeanPostProcessor知晓。如果显式配置Spring的SimpleJndiBeanFactory,则可以通过JNDI解析名称。然而,我们建议依赖默认行为并使用Spring的JNDI查找功能以保留间接级别。
@Resource使用时没有明确指定名称,并且类似于 @Autowired@Resource会找到主要类型匹配而不是特定命名的bean,并解析已知可解析的依赖项: BeanFactoryApplicationContextResourceLoaderApplicationEventPublisherMessageSource接口。

customerPreferenceDao字段首先查找名为"customerPreferenceDao"的bean,然后回退到类型 CustomerPreferenceDao的主要类型匹配:

  • Java

  • Kotlin

public class MovieRecommender {

	@Resource
	private CustomerPreferenceDao customerPreferenceDao;

	@Resource
	private ApplicationContext context; (1)

	public MovieRecommender() {
	}

	// ...
}
1 context字段基于已知可解析的依赖类型ApplicationContext进行注入。
class MovieRecommender {

	@Resource
	private lateinit var customerPreferenceDao: CustomerPreferenceDao


	@Resource
	private lateinit var context: ApplicationContext (1)

	// ...
}
1 context字段基于已知可解析的依赖类型ApplicationContext进行注入。