스프링5; Bean 라이프사이클

🗓️

Bean Lifecycle

  • 스프링 컨테이너를 초기화하고 종료할 때는 다음 작업을 수행한다.
  1. 컨테이너 초기화 → bean 객체의 생성, 의존 주입, 초기화
  2. 컨테이너 종료 → bean 객체의 소멸

초기화와 소멸의 bean 인터페이스

InitializingBean

public interface InitializingBean {
    void afterPropertiesSet() throws Exception;
}
  • bean객체가 생성 된 InitializingBean 클래스의 afterPropertiesSet() 메소드가 호출된다.
  • 초기화 직후 필요한 작업이 있다면 이 클래스를 구현하면 된다.

DisposableBean

public interface DisposableBean {
    void destroy() throws Exception;
}
  • bean객체가 소멸할때 close()로 호출하는데 이 호출되는 과정에서 DisposableBean 클래스의 destroy()가 호출된다.
  • 소멸 과정에서 필요한 작업이 있다면 이 클래스를 구현하면 된다.

그래서 언제 필요한데?

데이터베이스 커넥션 풀의 연결과 연결해제.
채팅 프로그램의 서버 연결과 연결해제.

실제

1. 연결과 해제를 담당하는 구현체

public class Client implements InitializingBean, DisposableBean {

    private String host;

    public void setHost(String host) {
        this.host = host;
    }

    @Override
    public void afterPropertiesSet() throws Exception { // <<<<
        System.out.println("Client.afterPropertiesSet() 실행");
    }

    public void send() {
        System.out.println("Client.send() to " + host);
    }

    @Override
    public void destroy() throws Exception { // <<<< 
        System.out.println("Client.destroy() 실행");
    }

}

2. bean 설정

@Configuration
public class AppCtx {

    @Bean
    public Client client() {
        Client client = new Client();
        client.setHost("host");
        return client;
    }
}

3. 스프링 실행

    public static void main(String[] args) throws IOException {
        AbstractApplicationContext ctx = 
                new AnnotationConfigApplicationContext(AppCtx.class);

        Client client = ctx.getBean(Client.class);
        client.send();

        ctx.close();
    }

4. 실행 후 콘솔 결과

Client.afterPropertiesSet() 실행
Client.send() to host
Client.destroy() 실행

처음 설명대로 생성 뒤에 afterProperties()가 바로 실행되고 close()뒤에 destroy()가 실행 된다.

초기화와 소멸의 bean 인터페이스 커스텀

  • 직접 구현한 클래스가 아닌 외부에서 받은 소스의 경우 InitializingBeanDisposableBean 인터페이스의 구현체를 만들 수 없다.
  • 또한 외부의 소스에서 두 인터페이스를 구현해야하는데 사용하고 싶지 않은 경우도 있을 수 있다.

1. 일반적인 서비스 코드

public class Client2 {

    private String host;

    public void setHost(String host) {
        this.host = host;
    }

    public void connect() {
        System.out.println("Client2.connect() 실행");
    }

    public void send() {
        System.out.println("Client2.send() to " + host);
    }

    public void close() {
        System.out.println("Client2.close() 실행");
    }

}

2. bean 설정

@Configuration
public class AppCtx {
    @Bean(initMethod = "connect", destroyMethod = "close")
    public Client2 client2() {
        Client2 client = new Client2();
        client.setHost("host");
        return client;
    }
}
  • bean 어노테이션에 initMethoddestroyMethod를 명시하고 bean객체가 초기화 되고 소멸할때 사용할 메소드 이름을 입력해주면 된다.

3. 실행

Client2.connect() 실행
Client2.send() to host
Client2.close() 실행

마찬가지로 실행된다.