스프링에서 빈 생명주기 콜백을 지원하는 방법은 3가지가 있다.

 

1. 인터페이스(InitializingBean, DisposableBean)  

public class NetworkClient implements InitializingBean, DisposableBean {

    private String url;
    public NetworkClient() {
        ...
    }

    // 서비스 시작시 호출
    public void connect() {
        ...
    }

    public void call() {
        ...
    }

    // 서비스 종료시 호출
    public void disconnect() {
        ...
    }

    @Override  // 의존성 주입 이후에 실행 (InitializingBean)
    public void afterPropertiesSet() throws Exception {
        connect();
        call();
    }

    @Override  // 빈 소멸 전 호출 (DisposableBean)
    public void destroy() throws Exception {
        disconnect();
    }
}

 관련 로직은 직접 구현해야 한다

 

-> 요즘은 별로 사용하지 않는 방식이다.

 

 

 

 

2. 설정 정보에 초기화 메서드, 종료 메서드 지정

public class NetworkClient {

    private String url;
    public NetworkClient() {
        ...
    }

    // 서비스 시작시 호출
    public void connect() {
        ...
    }

    public void call() {
        ...
    }

    // 서비스 종료시 호출
    public void disconnect() {
        ...
    }

    public void init() {
        connect();
        call();
    }

    public void close() {
        disconnect();
    }
}

.
.
.

@Configuration
static class LifeCycleConfig {

    // networkClient.init(), networkClient.close() 를 초기화, 소멸자 메서드로 사용한다 
    @Bean(initMethod = "init", destroyMethod = "close")
    public NetworkClient networkClient() {
    	NetworkClient networkClient = new NetworkClient();
        return networkClient;
    }
}

 

@Bean() 에서 속성을 줄 수 있다.

@Component에 적용시키니까 컴파일 에러가 발생한다. 아마 자동 등록에서는 쓸 수 없는 방식인 듯?

 

코드에 직접적으로 변화를 주는 것이 아니라 설정 정보(@Configuration)를 사용하는 것이기 때문에 코드를 고칠 수 없는 외부 라이브러리에도 초기화, 종료 메서드를 적용할 수 있게 된다.

 

 

 

3. @PostConstruct, @PreDestory (이걸 쓰면 된다)

public class NetworkClient {

    private String url;
    public NetworkClient() {
        ...
    }

    // 서비스 시작시 호출
    public void connect() {
        ...
    }

    public void call() {
        ...
    }

    // 서비스 종료시 호출
    public void disconnect() {
        ...
    }

    @PostConstruct
    public void init() {
        connect();
        call();
    }

    @PreDestroy
    public void close() {
        disconnect();
    }
}

 

해당 메서드들에 직접적으로 어노테이션을 달아주면 된다.

(클래스에 직접 적용된 코드이니 당연히 @Componenet를 써도 잘 돌아간다)

 

스프링에서 직접 권장하는 방식이므로 그냥 이걸 사용하자.

 

코드를 직접적으로 추가해야 하기 때문에 외부 라이브러리에는 적용이 불가능하다. 외부 라이브러리에 대해서는 2번 방식(@Bean(initMethod = "init", destroyMethod = "close"))을 사용해야 한다.

+ Recent posts