해당 게시물은 인프런 - "스프링 핵심 원리 - 기본편" 강의를 참고하여 작성한 글 입니다
유료강의이므로 자세한 내용은 없고, 간단한 설명 위주로 정리했습니다 강의 링크
데이터베이스 커넥션 풀이나, 네트워크 소켓처럼 애플리케이션 시작 시점에 필요한 연결을 미리 해두고, 애플리케이션 종료 시점에 모두 종료하는 작업을 진행하려면, 객체의 초기화와 종료 작업이 필요하다
스프링 빈은 다음과 같은 라이프사이클을 가진다
객체 생성 -> 의존관계 주입
스프링은 의존관계 주입이 완료되면 스프링 빈에게 콜백 메소드를 통해서 초기화 시점을 알려주는 다양한 기능을 제공한다
스프링 컨테이너 생성 -> 스프링 빈 생성 -> 의존관계 주입 -> 초기화 콜백 -> 사용 -> 소멸 전 콜백 -> 스프링 종료
이 인터페이스는 스프링 전용 인터페이스다
해당 코드가 스프링 전용 인터페이스에 의존한다
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
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);
}
@Override
public void afterPropertiesSet() throws Exception {
connect();
call("초기화 연결 메시지");
}
@Override
public void destroy() throws Exception {
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;
}
}
초기화 콜백 메소드는 init, 소멸 콜백 메소드 이름이 close로 지정했다
최신 스프링에서 권장하는 방법으로 자바 표준에서 만든 기술이다
애노테이션 하나만 붙이면 되므로 매우 편리하다
import jakarta.annotation.PostConstruct;
import jakarta.annotation.PreDestroy;
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);
}
@PreDestroy
public void close() throws Exception {
System.out.println("NetworkClient.close");
disconnect();
}
@PostConstruct
public void init() throws Exception {
System.out.println("NetworkClient.init");
connect();
call("초기화 연결 메시지");
}
}