LifeCycle Annotation
IoC의 Life Cycle
에서 설명한 바와 같이 Bean의 LifeCycle은 Initializaion ->Activation -> Destruction으로 구성되어 있으며,
LifeCycle 메소드를 정의하는 경우 컨테이너 기동시 또는 종료시 필요한 로직을 수행할 수 있게 된다.
Bean을 초기화하고 소멸시 별도 작업이 필요한 경우 기존에는 InitializingBean과 DesposableBean 인터페이스를 상속하거나 Bean 정의시 명시적으로
초기화 메소드와 소멸 메소드 별도 지정할 필요가 있었다. 그러나, 다음과 같은 Annotation을 사용할 경우에는 XML 또는 별도 인터페이스 상속없이 Bean의 LifeCycle 관리가 가능해진다.
또한, Spring에서 제공하는 초기화와 소멸과 관련된 메소드에는 어떤 것들이 있는지 정리해본다.
@PostConstruct
JSR-250 표준 Annotation으로 Bean 초기화시 필요한 작업을 담은 메소드에 대해 정의한다.
@PostConstruct를 사용하기 위해서는 클래스패스 내에 jsr250-api.jar 파일이 추가되어 있어야 한다.
@PostConstruct
// 메소드명은 자유롭게 정의할 수 있다.
public void initialize() {
// ...
}
@PreDestroy
JSR-250 표준 Annotation으로 Bean 소멸시 필요한 작업을 담은 메소드에 대해 정의한다.
@PreDestroy를 사용하기 위해서는 클래스패스 내에 jsr250-api.jar 파일이 추가되어 있어야 한다.
@PreDestroy
public void dispose() {
// ...
}
Combining lifecycle mechanisms
앞에서 설명한 바와 같이, Spring 2.5에서 bean lifecycle을 관리할 수 있는 방법은 다음과 같이 세가지가 있다.
- InitializingBean과 DisposableBean callback 인터페이스 이용
- 사용자가 init()과 destroy() 메소드 정의
- @PostConstruct와 @PreDestroy annotation 이용
위의 3가지 방법이 동시에 존재하는 경우(예를 들어, 3가지 방법이 각각 정의된 클래스가 Parent-child 관계를 가지는 경우), 실행되는 순서는 다음과 같다.
Initialization 메소드
- @PostConstruct를 이용하여 정의한 메소드
- InitializingBean 인터페이스의 afterPropertiesSet() 메소드
- 사용자가 정의한 custom init() 메소드
Destroy 메소드
- @PreDestroy를 이용하여 정의한 메소드
- DisposableBean 인터페이스의 destroy() 메소드
- 사용자가 정의한 custom destroy() 메소드