앞서 스프링 컨테이너에서 배웠듯 스프링 컨테이너는 두 단계에 걸쳐 만들어진다. 객체를 생성하고 그 후에 의존관계를 주입한다. 따라서 객체의 데이터들의 초기화 작업은 의존관계 주입이 모두 완료되고 호출해야 한다. 스프링은 콜백 메소드를 통해서 초기화 시점과 종료되기 직전 소멸 콜백을 준다.
- 스프링 컨테이너 생성 -> 스프링 빈 생성 -> 의존관계 주입 -> 초기화 콜백 -> 사용 -> 소멸 전 콜백 -> 스프링 종료
3가지 방법
인터페이스
- InitializingBean, DisposableBean 인터페이스가 초기화와 소멸 콜백을 지원한다.
public class CallBack implements InitializingBean,DisposableBean {
@Override
public void afterPropertiesSet() throws Exception {}
@Override
public void destroy() throws Exception {}
}
- 이 인터페이스는 스프링 전용 인터페이스이다. 따라서 스프링에 의존한다
- 메소드의 이름을 변경할 수 없다.
- 코드를 고칠 수 없는 외부 라이브러리에는 적용할 수 없다.
설정 정보에 초기화, 종료 메소드 지정
public class Config {
@Bean(initMethod = "init", destroyMethod = "close")
public Car car(){
return car;
}
}
- Car 클래스의 init메서드를 초기화메서드로 지정한다.
- 메서드 이름을 자유롭게 줄 수 있다.
- 설정 정보를 사용하기 때문에 코드를 고칠 수 없는 외부 라이브러리에도 적용할 수 있다.
- 종료 메서드 추론
- 라이브러리는 대부분 close, shutdown 이라는 이름을 사용한다.
- @Bean 의 destroyMethod는 기본값이 (inferred)(추론)으로 등록되있다.
- 이 추론 기능은 close, shutdown 이라는 이름의 메서드를 자동으로 호출해줘서 따로 명시하지 않아도 호출할 수 있다.
@PostConstruct, @Predestroy
public class Car {
@PostConstruct
public void init(){}
@Predestroy
public void destroy(){}
}
- 가장 권장하는 방법이다. 어노테이션만 붙이면 되므로 편리하다.
- 컴포넌트 스캔과 잘 어울리고, 스프링에 종속적이지 않다.
- 코드를 변경하지 못하는 외부 라이브러리에는 적용하지 못한다. 따라서 외부 라이브러리를 초기화, 종료해야 한다면 구성정보를 활용하자.