✔️ 스프링 컨테이너 생성 ➡️ 스프링 빈 생성 ➡️ 의존관계 주입 ➡️ 초기화 콜백 ➡️ 사용 ➡️ 소멸전 콜백 ➡️ 스프링 종료
❓ 생성자에서 객체 생성과 초기화 작업을 동시에 하면 편리할텐데 왜 객체의 생성과 초기화를 분리하는 것일까?
💡 싱글톤 빈들은 스프링 컨테이너가 종료될 때 싱글톤 빈들도 종료되기 때문에 스프링 컨테이너가 종료되기 직전에 소멸전 콜백이 일어난다. 이와 다르게, 생명주기가 짧은 빈들도 있어서 스프링 컨테이너와 무관하게 해당 빈이 종료되기 직전에 소멸전 콜백이 일어난다.
✔️ 인터페이스(InitializingBean, DisposableBean)
✔️ 설정 정보에 초기화 메소드, 종료 메소드 지정
✔️ @PostConstruct, @PreDestory 어노테이션
afterPropertiesSet()
메소드로 초기화를 지원destroy()
메소드로 소멸을 지원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();
}
}
@Bean(initMethod = "init", destroyMethod = "close")
와 같이 초기화, 소멸 메소드를 지정할 수 있다.public void init() {
System.out.println("NetworkClient.init");
connect();
call("초기화 연결 메시지");
}
public void close() {
System.out.println("NetworkClient.close");
disConnect();
}
@Configuration
static class LifeCycleConfig {
//@Bean의 속성으로 초기화, 종료 메소드를 지정한다.
@Bean(initMethod = "init", destroyMethod = "close")
public NetworkClient networkClient() {
NetworkClient networkClient = new NetworkClient();
networkClient.setUrl("http://hello-spring.dev");
return networkClient;
}
}
close, shutdown
이라는 이름의 종료 메소드를 사용한다.(inferred)
으로 등록되어 있다.destroyMethod=""
와 같이 공백으로 지정하면 된다.@PostConstruct
public void init() {
System.out.println("NetworkClient.init");
connect();
call("초기화 연결 메시지");
}
@PreDestroy
public void close() {
System.out.println("NetworkClient.close");
disConnect();
}
@Configuration
static class LifeCycleConfig {
@Bean
public NetworkClient networkClient() {
NetworkClient networkClient = new NetworkClient();
networkClient.setUrl("http://hello-spring.dev");
return networkClient;
}
}
참고 Reference