Spring

[Spring] ApplicationContextAware, BeanNameAware 인터페이스

재담 2022. 2. 14. 00:24

빈으로 사용될 객체에서 스프링 컨테이너에 접근해야 한다거나, 빈 객체에서 로그를 기록할 때 빈의 이름을 남기고 싶다면 다음의 두 인터페이스를 구현하면 된다.

  • ApplicationContextAware : 초기화 과정에서 컨테이너(ApplicationContext)를 전달받는다.
  • BeanNameAware : 초기화 과정에서 빈 이름을 전달받는다.

ApplicationContextAware 인터페이스를 구현한 클래스는 setApplicationContext() 메서드를 통해서 컨테이너 객체를 전달받는다. 전달받은 컨테이너를 필드에 보관 후, 이를 이용해서 다른 빈 객체를 구하거나 컨테이너가 제공하는 기능(이벤트 발생, 메시지 구하기)을 사용할 수 있다.

public class WorkScheduler implements ApplicationContextAware {

    private WorkRunner workRunner;
    private ApplicationContext ctx;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.ctx = applicationContext;
    }

    public void makeAndRunWork() {
        for (long order = 1; order <= 10; order++) {
            Work work = ctx.getBean("workProto", Work.class);
            work.setOrder(order);
            workRunner.execute(work);
        }
    }

    // 이하 생략
    ...
}

 

BeanNameAware 인터페이스를 구현한 클래스는 setBeanName() 메서드를 이용해서 빈의 이름을 전달받는다. 로그 메시지에 빈의 이름을 함께 기록해야 할 때처럼 빈의 이름이 필요한 경우에 BeanNameAware 인터페이스를 사용하면 된다.

public class WorkRunner implements BeanNameAware {

    private String beanId;

    @Override
    public void setBeanName(String name) {
        this.beanId = name;
    }

    public void execute(Work work) {
        System.out.printf("WorkRunner[%s] execute Work[%d]\n", beanId, work.getOrder());
        work.run();
    }

    // 이하 생략
    ...
}

주로 같은 타입을 가진 빈 객체들이 두 개 이상 존재하고, 각 빈을 이름으로 구분해야 할 때 BeanNameAware 인터페이스를 사용한다.


Reference

  • 웹 개발자를 위한 Spring 4.0 프로그래밍 (최범균 저)