본문 바로가기

SpringFramework Core - I. IoC 컨테이너/9. 어노테이션 기반의 컨테이너 설정

9.7. @Resource로 주입하기

원문: https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/core.html#beans-resource-annotation

 

 

스프링은 JSR-250의 @Resource 어노테이션(javax.annotation.Resource)을 통해서도 필드들이나 bean 프로퍼티 setter 메소드들에 주입하는 것을 지원한다. 이는 JSF-managed bean들이나 JAX-WS endpoint들과 같은, 자바 EE에서는 보편적인 패턴이다. 스프링은 스프링의 관리 대상 객체들에게도 이러한 패턴을 지원해준다.

 

@Resource는 이름 속성을 취한다. 기본적으로, 스프링은 그 값을 주입될 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의 이름으로 분석된다. 만약 여러분이 스프링의 SimpleJndiBeanFactory를 명확히 설정했다면, JNDI를 통해서 이름들이 분석된다. 그러나 우리는 여러분이 기본값을 따를 것을 권장한다. 스프링의 JNDI의 검색 기능은 간접적인 수준으로 보완하는 정도로만 사용하면서 말이다.

 

명확한 이름 설정없이 @Resource를 배타적으로 사용하는 경우에는 @Autowired의 경우와 유사하게, @Resource가 특정 이름의 bean을 찾기보다 매치되는 최우선 타입을 찾는다. 또한 잘 알려진 분석가능한 의존성들을 분석한다. 그 의존성들은 BeanFactory, ApplicationContext, ResourceLoader, ApplicationEventPublisher 그리고 MessageSource 인터페이스들이다. 

 

그래서 다음 예시에서는 customerPreferenceDao 필드가 먼저 "customerPreferenceDao"라는 이름의 bean을 찾게되고, 그 다음 대비책으로써 CustomerPreferenceDao 타입과 최우선적으로 일치하는 bean을 찾게될 것이다. 

public class MovieRecommender {

    @Resource
    private CustomerPreferenceDao customerPreferenceDao;
    
    @Resource
    private ApplicationContext context;
    
    public MovieRecommender() {
    }
    
    // ...
}