본문 바로가기
Homo Faber/Idioms

Spring에서 annotation 태그 사용하기 (3)

by javauser 2008. 2. 21.
CustomerAutowireConfigurer

CustomerAutowireConfigurer는 자동엮음(autowiring) 프로세스를 수정하여 만들 수 있게 하는 BeanFactoryPostProcessor이다. 특히, 만들어진 qualifier annotation 유형이 Spring의 @Qualifier annotation을 사용하지 않는다고 하더라도 등록이 가능하다.
<bean id="customAutowireConfigurer"
   class="org.springframework.beans.factory.annotation.CustomAutowireConfigurer">
   <property name="customQualifierTypes">
      <set>
         <value>example.CustomQualifier</value>
      </set>
   </property>
</bean>
어플리케이션 컨텍스트에 대해 활성화되는 AutowireCadidateResolver의 특별한 구현체는 자바 버전에 달려있음을 유의하라. 만일 자바 5 이전에서 실행한다면 qualifier annotation은 지원이 안되며, 자동엮음 대상 후보들은 각각의 빈 정의의 'autowire-candidate' 값 뿐만 아니라 <beans/>에 사용 가능한 'default-autowire-candidates' 패턴에 의해서 결정된다. 만일 자바 5 이상에서 실행되면, @Qualifier annotation이나 CustomAutowireConfigurer와 같이 등록된 만들어진 annotation의 사용은 그대로 작동할 것이다.

자바 버전에 상관없이 "주요" 대상 후보의 결정(여러 빈들이 자동엮음 대상으로 지정될 때)은 동일하다. 만일 대상 후보들 중에 정확하게 한개의 빈 정의가 'true' 로 세팅된 'primary' 속성을 가진다면 이것이 선택된다.

@Resource

Spring은 또한 JSR-250의 @Resource annotation을 사용하여 자동엮음 지원한다. @Resource는 항상 값을 가지며, 기본적으로 Spring은 그 값을 자동엮여질 빈의 이름으로 해석한다. 즉, 다음의 예제는 byName을 통해서 자동엮여지게 된다.
public class SimpleMovieLister {
   private MovieFinder movieFinder;
   @Resource(name="myMovieFinder")
   public void setMovieFinder(MovieFinder movieFinder) {
      this.movieFinder = movieFinder;
   }
}

주의 - annotation을 사용하여 제공된 이름은 CommonAnnotationBeanPostProcessor가 인식하는 BeanFactory에 의한 빈 이름으로 해석된다. 만일 Spring의 SimpleJndiBeanFactory가 명시적으로 설정되어 있다면 이름은 JNDI를 통해 연결된다. 하지만, 기본적인 행위에 의존하도롤 세팅하고 단순히 간접적인 차원으로 유지하도록 Spring의 JNDI lookup 기능을 사용하기를 권한다.

@PostConstruct와 @PreDestroy

CommonAnnotationBeanPostProcessor는 @Resource annotation 뿐만 아니라 JSR-250의 생명주기 annotation을 인식한다. Spring 2.5에서 소개되었지만, 이러한 annotation에 대한 지원은 초기화 콜백과 소멸화 콜백의 또 다른 방법을 제공한다. CommonAnnotationBeanPostProcessor가 Spring의 ApplicationContext 내에서 등록되는 것을 제공하는 것처럼 이러한 annotation 중 하나를 가지는 메소드는 대응되는 Spring의 생명주기 인터페이스의 메소드나 명시적으로 선언된 콜백 메소드처럼 생명주기에 동일한 시점에 호출된다. 아래 예제에서 캐시는 초기화에서 사전에 생성되고 소멸화에 없어진다.
public class CachingMovieLister {
   @PostConstruct
   public void populateMovieCache() {
      // populates the movie cache upon initialization ...
   }

   @PreDestroy
   public void clearMovieCache() {
      // clears the movie cache upon destruction ...
   }
}
}
반응형