본문 바로가기

SpringFramework Core - I. IoC 컨테이너/6. Bean 커스터마이징하기

1.6.2. ApplicationContextAware과 BeanNameAware

ApplicationContext가 org.springframework.context.ApplicationContextAware 인터페이스를 구현한 객체의 인스턴스를 만들면, 그 인스턴스는 ApplicationContext를 참조로써 제공받는다. 다음 예시는 ApplicationContextAware 인터페이스의 정의를 보여준다.

public interface ApplicationContextAware {

    void setApplicationContext(ApplicationContext applicationContext) throws BeansException;
}

그래서 bean들은 프로그램적으로 그들 스스로를 만들어낸 ApplicationContext를 조작할 수 있게 된다. ApplicationContext 인터페이스를 통해서나, ConfigurableApplicationContext같은 인터페이스의 서브클래스에 참조로 캐스팅하는 방식을 통해서 조작이 가능하다. 한가지 용도는 다른 bean들을 프로그램적으로 반환받는 것이다. 때때로 이런 기능은 유용하다. 그러나 일반적으로 이런 방식을 피해야 한다. 왜냐하면 이 방식은 스프링의 코드와 결합하며 제어 역전의 스타일을 따르지 않기 때문이다. ApplicationContext의 다른 메소드들은 파일 리소스로의 접근, 애플리케이션 이벤트 발생, MessageSource로의 접근을 제공한다. 이러한 추가적인 기능들은 ApplicationContext의 추가 기능들에 설명되어 있다.

 

Autowiring은 ApplicationContext에 대한 참조를 얻는 또다른 대안이다. 전통적인 constructor와 byType autowiring 모드들은 ApplicationContext 타입을 생성자 변수 방식이나 setter 메소드 변수 방식으로 제공할 수 있다. 더 유연하게는, autowire 할 수 있는 필드들 및 여러 변수의 메소드들을 포함한 채로 어노테이션 기반의 autowiring 기능을 사용하는 것이다. 만약 @Autowired 어노테이션을 달고 있다면 ApplicationContext는 필드로, 생성자 변수로, 메소드 변수로 autowired될 것이다. 더 자세한 정보를 원한다면 @Autowired 사용하기를 참고하라.

 

ApplicationContext가 org.springframework.beans.factory.BeanNameAware 인터페이스를 구현한 클래스를 생성할 때, 클래스는 자기와 관련된 객체에 정의된 이름을 참조로 제공받는다. 다음은 BeanNameAware 인터페이스의 정의를 보여준다.

public interface BeanNameAware {
 
    void setBeanName(String name) throws BeansException;
}

콜백은 일반적인 bean의 프로퍼티들이 모두 채워진 후에 호출된다. 하지만 InitializingBean, afterPropertiesSet, 커스텀한 init 메소드같은 초기화 콜백보다는 빨리 호출된다.