빈 콜백 생명주기

강한친구·2022년 4월 12일
0

Spring

목록 보기
6/27

빈의 라이프사이클

객체를 전부 생성 -> 의존관계 주입
물론 생성자 주입은 예외적으로 만들때 관계가 같이 들어온다

스프링빈의 이벤트라이프사이클

스프링 컨테이너 생성 -> 스프링 빈 생성(생성자의 경우 이단계에서 의존관계도 주입) -> 의존관계 주입 -> 초기화 콜백 -> 사용 -> 소멸전 콜백 -> 스프링 종료

객체의 생성과 초기화를 분리한다

생성자는 필수정보를 받고 메모리를 할당해서 생성하는 책임을 가진다. 하지만 초기화는 이 값들을 이용해서 외부커넥션을 시도한다.
따라서 이 둘을 분리해야 유지보수 관점에서 좋다.

인터페이스로 초기화와 콜백 받기

public class NetworkClient implements InitializingBean, DisposableBean {

    //의존관계 주입이 끝나면
    @Override
    public void afterPropertiesSet() throws Exception {
        connect();
        call("초기화 연결 메세지");
    }
    // 모든 빈이 내려가면 
    @Override
    public void destroy() throws Exception {
        disconnect();
    }
}

이런식으로 인터페이스를 써서 사용하면 된다.

단점
이는 스프링 인터페이스이다. 따라서 좋은 방법이라고는 할 수 없다.
또한 초기화, 소멸 메서드의 이름을 변경할 수 없고, 내가 코드를 고칠 수 없는 인터페이스 적용이다.

따라서 최근에는 쓰지 않는다.

빈 등록 초기화, 소멸 메서드

    public void init() {
        connect();
        call("초기화 연결 메세지");
    }
    public void close() {
        disconnect();
    }

이런 코드를 만들고,

        @Bean(initMethod = "init", destroyMethod = "close")

Bean 어노테이션에 해당 값들을 지정해주면 된다.

destorymethod의 기능
외부 라이브러리의 종료 메서드는 대부분 close 혹은 shutdown이다. 따라서 이 destorymethod는 기본값을 이 두 값으로 설정한다. 따라서 destorymethod를 따로 설정하지 않아도 알아서 닫아버린다.

Annotation 적용

@PostConstruct @PreDestroy

    @PostConstruct
    public void init() {
        connect();
        call("초기화 연결 메세지");
    }
    @PreDestroy
    public void close() {
        disconnect();
    }

이는 자바가 지원하는 패키지이다. 따라서 다른 컨테이너 환경에서도 사용이 가능하고, 스프링에서도 권장중이다.

코드를 고칠 수 없는 외부 라이브러리의 경우 위에 적힌 방법을 사용하면 된다.

0개의 댓글