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 프로그래밍 (최범균 저)