Spring Bean은 생성되고, 의존관계 주입이 완료된 후, 초기화 콜백 메서드가 호출된다.

그리고, 사용이 끝나면 소멸 전 콜백 메서드가 호출된다.

Spring Bean Lifecycle

  1. Spring Container 생성
  2. 객체 생성
  3. 의존관계 주입
  4. 초기화 콜백
  5. 사용
  6. 소멸전 콜백
  7. 객체 소멸
  8. Spring Container 종료

Spring Bean Lifecycle Callback

  • 초기화 Callback
    • Bean 객체가 생성되고, Bean의 의존관계가 주입이 완료된 후 호출
  • 소멸전 Callback
    • Bean 객체가 소멸되기 직전에 호출

InitializingBean, DisposableBean

  • InitializingBean::afterPropertiesSet() 메서드를 통해 초기화 콜백을 제공한다.
  • DisposableBean::destroy() 메서드를 통해 소멸전 콜백을 제공한다.
  • 단점
    • Spring 전용 인터페이스이므로, Spring Framework에 의존한다.
    • 외부 라이브러리에 적용할 수 없다.
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(initMethod = "init", destroyMethod = "close")

  • @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, @PreDestroy

  • @PostConstruct
    • 어노테이션을 사용하여 초기화 콜백 메서드를 지정할 수 있다.
    • javax.annotation.PostConstruct
  • @PreDestroy
    • 어노테이션을 사용하여 소멸전 콜백 메서드를 지정할 수 있다.
    • javax.annotation.PreDestroy
  • 장점
    • JSR-250 Java 표준이다.
    • Spring에서 가장 권장하는 방법
  • 단점
    • 외부 라이브러리에 적용할 수 없다.
코드 예시

@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();
    }
}

profile
Hello velog!

0개의 댓글