Spring Framework/Spring IoC

Injection with @Resource

헬로우월드 2024. 11. 14. 20:05

Spring은 JSR-250의 @Resource 애노테이션(jakarta.annotation.Resource)을 필드나 빈 속성 세터 메서드에 사용하여 주입을 지원합니다. 이는 Jakarta EE에서 흔히 사용되는 패턴으로, 예를 들어 JSF 관리 빈JAX-WS 엔드포인트에서 사용됩니다. Spring은 Spring 관리 객체에 대해 이 패턴을 지원합니다.

@Resource에는 name 속성이 있습니다.  디폴트로 Spring은 이 값을 주입할 빈 이름으로 해석합니다. 즉, 이름에 따른(by-name) 주입 방식을 따르며, 다음 예제와 같이 사용할 수 있습니다:

public class SimpleMovieLister {

	private MovieFinder movieFinder;

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

 

이 라인은 @Resource를 주입합니다.

 

이름이 명시적으로 지정되지 않은 경우, 디폴트 이름은 필드 이름이나 세터 메서드에서 유도됩니다. 필드의 경우 필드 이름을 따르고, 세터 메서드의 경우 빈 속성 이름을 따릅니다. 다음 예제는 movieFinder라는 이름의 빈을 세터 메서드에 주입하게 됩니다.

public class SimpleMovieLister {

	private MovieFinder movieFinder;

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

 

애노테이션에 제공된 이름은 CommonAnnotationBeanPostProcessor가 인식하는 ApplicationContext에 의해 빈 이름으로 해석됩니다. Spring의 SimpleJndiBeanFactory를 명시적으로 구성하면 이름을 JNDI를 통해 해석할 수 있습니다. 그러나 디폴트 동작을 사용하는 것이 좋으며, 간접성을 유지하기 위해 Spring의 JNDI 조회 기능을 사용하는 것을 권장합니다.

 

@Resource를 사용할 때 명시적인 이름을 지정하지 않은 경우에 한해, @Autowired와 유사하게 특정 이름이 아닌 디폴트 타입 일치를 찾으며, 다음과 같은 잘 알려진 해석 가능한 의존성들을 해결합니다: BeanFactory, ApplicationContext, ResourceLoader, ApplicationEventPublisher, 그리고 MessageSource 인터페이스들입니다.

따라서, 다음 예제에서 customerPreferenceDao 필드는 먼저 "customerPreferenceDao"`라는 이름의 빈을 찾고, 그다음에 CustomerPreferenceDao 타입의 디폴트 타입 일치로 대체됩니다.

public class MovieRecommender {

	@Resource
	private CustomerPreferenceDao customerPreferenceDao;

	@Resource
	private ApplicationContext context;  (1)

	public MovieRecommender() {
	}

	// ...
}

 

(1) context 필드는 잘 알려진 해석 가능한 의존성 타입인 ApplicationContext를 기반으로 주입됩니다.