데이터베이스 커넥션 풀이나, 네트워크 소켓처럼
초기화 작업과 종료 작업이 어떻게 진행되는지 알아보자!
스프링 컨테이너 생성 => 스프링 빈 생성 => 의존관계 주입 => 초기화 콜백 => 사용 => 소멸전 콜백 => 스프링 종료
초기화 콜백: 빈을 생성, 빈의 의존관계 주입이 완료된 후 호출
소멸전 콜백: 빈이 소멸되기 직전에 호출
💡객체의 생성과 초기화를 분리하자!
=> 일반적으로 생성자안에서는 가벼운 객체를 생성하는 작업을 하고,
초기화에서는 외부 커넥션을 연결하는등의 무거운 동작을 수행한다.
따라서 유지보수의 관점에서 분리하는 것이 유리!
public class A implements InitializingBean, DisposableBean {
//서비스 시작시 호출
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();
}
}
public class A {
...
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;
}
}
public class A {
@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;
}
}
💡 외부 라이브러리를 초기화, 종료해야 하면 @Bean 의 initMethod , destroyMethod를 사용 하면 됨!