Spring Bean은 생성되고, 의존관계 주입이 완료된 후, 초기화 콜백 메서드가 호출된다.
그리고, 사용이 끝나면 소멸 전 콜백 메서드가 호출된다.
InitializingBean::afterPropertiesSet()
메서드를 통해 초기화 콜백을 제공한다.DisposableBean::destroy()
메서드를 통해 소멸전 콜백을 제공한다.public interface InitializingBean {
void afterPropertiesSet() throws Exception;
}
public interface DisposableBean {
void destroy() throws Exception;
}
코드 예시
@Getter
public class NetworkClient1 implements InitializingBean, DisposableBean {
@Setter
private String url;
public NetworkClient1() {
System.out.println("생성자 호출, 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 {
System.out.println(this.getClass().getSimpleName() + ": init");
connect();
call("초기화 연결 메시지");
}
@Override
public void destroy() throws Exception {
System.out.println(this.getClass().getSimpleName() + ": close");
disconnect();
}
}
@Bean
어노테이션을 사용하여 초기화 콜백, 소멸전 콜백 메서드를 지정할 수 있다.destroyMethod
기본값: (inferred)
close
, shutdown
메서드를 자동으로 호출한다.destroyMethod = ""
를 설정한다.@Bean(initMethod = "init", destroyMethod = "close")
public NetworkClient2 networkClient() {
NetworkClient2 networkClient = new NetworkClient2();
networkClient.setUrl("http://hello-spring.dev");
return networkClient;
}
@PostConstruct
javax.annotation.PostConstruct
@PreDestroy
javax.annotation.PreDestroy
JSR-250
Java 표준이다.
@Getter
public class NetworkClient3 {
@Setter
private String url;
public NetworkClient3() {
System.out.println("생성자 호출, 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() {
System.out.println(this.getClass().getSimpleName() + ": init");
connect();
call("초기화 연결 메시지");
}
@PreDestroy
public void close() {
System.out.println(this.getClass().getSimpleName() + ": close");
disconnect();
}
}