데이터베이스 커넥션 풀이나 네트워크 소켓처럼 애플리케이션 시작 시점에 필요한 연결을 미리 해두고 애플리케이션 종료 시점에 연결을 모두 종료하는 작업을 진행하려면 객체의 초기화와 종료 작업이 필요하다.
✔️스프링 빈의 라이프 사이클
스프링 컨테이너 생성 → 스프링 빈 생성 → 의존관계 주입 → 초기화 콜백 → 사용 → 소멸 전 콜백 → 스프링 종료
✔️초기화 콜백 : 빈이 생성되고 빈의 의존관계 주입이 완료된 후 호출
✔️소멸 전 콜백 : 빈이 소멸되기 직전에 호출
✔️참고: 객체 생성과 초기화를 분리
public class NetworkClient implements InitializingBean, DisposableBean {
private String url;
public NetworkClient() {
System.out.println("생성자 호출, url = " + url);
}
public void setUrl(String url) {
this.url = url;
}
public void connect() {
System.out.println("connect: " + url);
}
public void call(String message) {
System.out.println("call: " + url + ", message: " + message);
}
public void disconnect() {
System.out.println("close: " + url);
}
// ✔️InitializingBean 인터페이스 구현
@Override
public void afterPropertiesSet() throws Exception {
connect();
call("초기화 연결 메시지");
}
// ✔️DisposableBean 인터페이스 구현
@Override
public void destroy() throws Exception {
disconnect();
}
}
public class BeanLifeCycleTest {
@Test
public void lifeCycleTest() {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(LifeCycleConfig.class);
NetworkClient networkClient = ac.getBean("networkClient", NetworkClient.class);
ac.close();
}
@Configuration
static class LifeCycleConfig {
@Bean
public NetworkClient networkClient() {
NetworkClient networkClient = new NetworkClient();
networkClient.setUrl("http://hello-spring.dev");
return networkClient;
}
}
}
InitializingBean
: afterPropertiesSet()
메서드로 초기화를 지원한다.Disposable
: destroy()
메서드로 소멸을 지원한다.public class NetworkClient {
private String url;
public NetworkClient() {
System.out.println("생성자 호출, url = " + url);
}
public void setUrl(String url) {
this.url = url;
}
public void connect() {
System.out.println("connect: " + url);
}
public void call(String message) {
System.out.println("call: " + url + ", message: " + message);
}
public void disconnect() {
System.out.println("close: " + url);
}
// ✔️빈 등록 초기화 메서드
public void init() {
connect();
call("초기화 연결 메시지");
}
// ✔️소멸 메서드
public void close() {
disconnect();
}
}
public class BeanLifeCycleTest {
@Test
public void lifeCycleTest() {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(LifeCycleConfig.class);
NetworkClient networkClient = ac.getBean("networkClient", NetworkClient.class);
ac.close();
}
@Configuration
static class LifeCycleConfig {
@Bean(initMethod = "init", destroyMethod = "close")
public NetworkClient networkClient() {
NetworkClient networkClient = new NetworkClient();
networkClient.setUrl("http://hello-spring.dev");
return networkClient;
}
}
}
public class NetworkClient {
private String url;
public NetworkClient() {
System.out.println("생성자 호출, url = " + url);
}
public void setUrl(String url) {
this.url = url;
}
public void connect() {
System.out.println("connect: " + url);
}
public void call(String message) {
System.out.println("call: " + url + ", message: " + message);
}
public void disconnect() {
System.out.println("close: " + url);
}
@PostConstruct
public void init() {
connect();
call("초기화 연결 메시지");
}
@PreDestroy
public void close() {
disconnect();
}
}