Bean Lifecycle
- 스프링 컨테이너를 초기화하고 종료할 때는 다음 작업을 수행한다.
- 컨테이너 초기화 → bean 객체의 생성, 의존 주입, 초기화
- 컨테이너 종료 → bean 객체의 소멸
초기화와 소멸의 bean 인터페이스
InitializingBean
public interface InitializingBean {
void afterPropertiesSet() throws Exception;
}
- bean객체가 생성 된 뒤
InitializingBean
클래스의afterPropertiesSet()
메소드가 호출된다. - 초기화 직후 필요한 작업이 있다면 이 클래스를 구현하면 된다.
DisposableBean
public interface DisposableBean {
void destroy() throws Exception;
}
- bean객체가 소멸할때
close()
로 호출하는데 이 호출되는 과정에서DisposableBean
클래스의destroy()
가 호출된다. - 소멸 과정에서 필요한 작업이 있다면 이 클래스를 구현하면 된다.
그래서 언제 필요한데?
데이터베이스 커넥션 풀의 연결과 연결해제.
채팅 프로그램의 서버 연결과 연결해제.
실제
1. 연결과 해제를 담당하는 구현체
public class Client implements InitializingBean, DisposableBean {
private String host;
public void setHost(String host) {
this.host = host;
}
@Override
public void afterPropertiesSet() throws Exception { // <<<<
System.out.println("Client.afterPropertiesSet() 실행");
}
public void send() {
System.out.println("Client.send() to " + host);
}
@Override
public void destroy() throws Exception { // <<<<
System.out.println("Client.destroy() 실행");
}
}
2. bean 설정
@Configuration
public class AppCtx {
@Bean
public Client client() {
Client client = new Client();
client.setHost("host");
return client;
}
}
3. 스프링 실행
public static void main(String[] args) throws IOException {
AbstractApplicationContext ctx =
new AnnotationConfigApplicationContext(AppCtx.class);
Client client = ctx.getBean(Client.class);
client.send();
ctx.close();
}
4. 실행 후 콘솔 결과
Client.afterPropertiesSet() 실행
Client.send() to host
Client.destroy() 실행
처음 설명대로 생성 뒤에 afterProperties()가 바로 실행되고 close()뒤에 destroy()가 실행 된다.
초기화와 소멸의 bean 인터페이스 커스텀
- 직접 구현한 클래스가 아닌 외부에서 받은 소스의 경우
InitializingBean
과DisposableBean
인터페이스의 구현체를 만들 수 없다. - 또한 외부의 소스에서 두 인터페이스를 구현해야하는데 사용하고 싶지 않은 경우도 있을 수 있다.
1. 일반적인 서비스 코드
public class Client2 {
private String host;
public void setHost(String host) {
this.host = host;
}
public void connect() {
System.out.println("Client2.connect() 실행");
}
public void send() {
System.out.println("Client2.send() to " + host);
}
public void close() {
System.out.println("Client2.close() 실행");
}
}
2. bean 설정
@Configuration
public class AppCtx {
@Bean(initMethod = "connect", destroyMethod = "close")
public Client2 client2() {
Client2 client = new Client2();
client.setHost("host");
return client;
}
}
- bean 어노테이션에
initMethod
와destroyMethod
를 명시하고 bean객체가 초기화 되고 소멸할때 사용할 메소드 이름을 입력해주면 된다.
3. 실행
Client2.connect() 실행
Client2.send() to host
Client2.close() 실행
마찬가지로 실행된다.