Injection With Resource

Inyección con @Resource

Spring también admite la inyección mediante la anotación JSR-250 @Resource (jakarta.annotation.Resource) en campos o métodos setter de propiedades de beans. Este es un patrón habitual en Jakarta EE, por ejemplo, en beans gestionados por JSF y puntos de conexión JAX-WS. Spring también admite este patrón para objetos gestionados por Spring.

@Resource acepta un atributo name. De forma predeterminada, Spring interpreta ese valor como el nombre del bean que debe inyectarse. En otras palabras, sigue una semántica de inyección por nombre, como se muestra en el siguiente ejemplo:

public class SimpleMovieLister {

	private MovieFinder movieFinder;

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

Si no se especifica explícitamente un nombre, el nombre predeterminado se deriva del nombre del campo o del método setter. En el caso de un campo, se utiliza el nombre del campo. En el caso de un método setter, se utiliza el nombre de la propiedad del bean.

El siguiente ejemplo inyecta el bean llamado movieFinder en su método setter:

public class SimpleMovieLister {

	private MovieFinder movieFinder;

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

El nombre proporcionado mediante la anotación se resuelve como un nombre de bean por el ApplicationContext del que tiene conocimiento CommonAnnotationBeanPostProcessor.

Los nombres pueden resolverse mediante JNDI si configuras explícitamente SimpleJndiBeanFactory de Spring. Sin embargo, se recomienda confiar en el comportamiento predeterminado y utilizar las capacidades de búsqueda JNDI de Spring para conservar el nivel de indirección.

En el caso exclusivo de usar @Resource sin especificar un nombre explícito, y de forma similar a @Autowired, @Resource busca primero una coincidencia de tipo principal en lugar de un bean concreto por nombre. También resuelve dependencias conocidas: las interfaces BeanFactory, ApplicationContext, ResourceLoader, ApplicationEventPublisher y MessageSource.

Por tanto, en el siguiente ejemplo, el campo customerPreferenceDao busca primero un bean llamado customerPreferenceDao y, si no lo encuentra, recurre a una coincidencia de tipo principal para CustomerPreferenceDao:

public class MovieRecommender {

	@Resource
	private CustomerPreferenceDao customerPreferenceDao;

	@Resource
	private ApplicationContext context;

	public MovieRecommender() {
	}

	// ...
}

El campo context se inyecta a partir del tipo de dependencia conocida y resoluble: ApplicationContext.