1. 빈 생명주기 콜백
객체의 초기화 작업
- 스프링 빈은 객체 생성 -> 의존관계 주입 후 초기화 작업을 호출할 수 있다.
- 개발자가 의존관계 주입이 완료된 시점을 어떻게 알 수 있을까?
- 스프링은 의존관계 주입이 완료되면 스프링 빈에게 콜백 메서드를 통해 초기화 시점을 알려주는 다양한 기능을 제공
- 스프링은 스프링 컨테이너가 종료되기 직전에 소멸 콜백을 통해 안전하게 종료하는 기능 제공
스프링 빈의 이벤트 라이프 사이클
- 스프링 컨테이너 생성 -> 스프링 빈 생성 -> 의존관계 주입 -> 초기화 콜백 -> 사용 ->
소멸전 콜백 -> 스프링 종료
- 콜백
- 초기화 콜백: 빈이 생성되고, 빈의 의존관계 주입이 완료된 후 호출
- 소멸전 콜백: 빈이 소멸되기 직전에 호출
2. 스프링이 제공하는 빈 생명주기 콜백
(1) 인터페이스 InitializingBean, DisposableBean
public class NetworkClient implements InitializingBean, DisposableBean {
@Override
public void afterPropertiesSet() throws Exception {
connect();
call("초기화 연결 메시지");
}
@Override
public void destroy() throws Exception {
disconnect();
}
}
InitializingBean
은 afterPropertiesSet()
메서드로 초기화를 지원한다.
DisposableBean
은 destroy()
메서드로 소멸을 지원한다.
- 동작과정
- 초기화 콜백을 받으면
afterPropertiesSet()
메서드가 호출됨
- 소멸전 콜백을 받으면
destroy()
메서드가 호출됨
- 단점
- 해당 코드가 스프링 전용 인터페이스에 의존하게 된다.
- 초기화, 소멸 메서드의 이름을 변경할 수 없다.
- 외부 라이브러리에 적용할 수 없다.
- 참고
(2) 설정 정보에 초기화 메서드, 종료 메서드 지정
public class NetworkClient {
public void init() {
System.out.println("NetworkClient.init");connect();
call("초기화 연결 메시지");
}
public void close() {
System.out.println("NetworkClient.close");
disConnect();
}
}
@Configuration
static class LifeCycleConfig {
@Bean(initMethod = "init", destroyMethod = "close")
public NetworkClient networkClient() {
NetworkClient networkClient = new NetworkClient();
networkClient.setUrl("http://hello-spring.dev");
return networkClient;
}
}
- 동작과정
- 초기화 콜백을 받으면 설정정보에 initMethod에 해당하는 메서드(init) 호출
- 소멸전 콜백을 받으면 설정정보에 initMethod에 해당하는 메서드(close) 호출
- 특징
- 메서드 이름을 자유롭게 변경할 수 있다.
- 스프링 빈이 스프링 코드에 의존하지 않는다.
- 코드가 아니라 설정 정보를 사용하기 때문에 코드를 고칠 수 없는 외부 라이브러리에도
초기화, 종료 메서드를 적용할 수 있다.
(3) @PostConstruct, @PreDestroy
public class NetworkClient {
@PostConstruct
public void init() {
System.out.println("NetworkClient.init");
connect();
call("초기화 연결 메시지");
}
@PreDestroy
public void close() {
System.out.println("NetworkClient.close");
disConnect();
}
}
- 동작과정
- 초기화 콜백을 받으면 @PostConstruct가 붙은 메서드 호출
- 소멸전 콜백을 받으면 @PreDestroy가 붙은 메서드 호출
- 특징
- 최신 스프링에서 가장 권장하는 방법
- 애노테이션만 붙이면 되므로 매우 편리하다
- 유일한 단점은 외부 라이브러리에 적용할 수 없다.