빈 생명주기 콜백

<aside> ❗

빈 생명주기 콜백 시작

[참고]

public class NetworkClient {

    private String url;

    public NetworkClient() {
        System.out.println("생성자 호출, url = "+ url);
        connect();
        call("초기화 연결 메시지");
    }

    public void setUrl(String url) {
        this.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);
    }

}
public class BeanLifeCycleTest {

    @Test
    public void lifeCycleTest() {
        ConfigurableApplicationContext ac = new AnnotationConfigApplicationContext(LifeCycleConfig.class);
        NetworkClient client = ac.getBean(NetworkClient.class);

        // ac.close()는 ApplicationContext에 존재하지 않음, ConfigurableApplicationContext - AnnotationConfigApplicationContext의 부모
        ac.close();
    }

    @Configuration
    static class LifeCycleConfig {

        @Bean
        public NetworkClient networkClient() {
            NetworkClient networkClient = new NetworkClient();
            networkClient.setUrl("<http://hello-spring.dev>");
            return networkClient;
        }

     }
}
// 결과
생성자 호출, url = null
connect: null
call: null message = 초기화 연결 메시지

[스프링 빈은 간단하게 다음과 같은 라이프사이클을 갖는다.]

[개발자가 어떻게 의존관계 주입이 모두 완료된 시점을 알 수 있는가 ??]

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

스프링 컨테이너 생성스프링 빈 생성의존관계 주입초기화 콜백

소멸전 콜백스프링 종료

[객체의 생성과 초기화를 분리하자 !!]

스프링은 크게 3가지 방법으로 빈 생명주기 콜백을 지원한다.

<aside> ❗

인터페이스(InitializingBean, Disposablebean)

public class NetworkClient implements InitializingBean, DisposableBean {
	@Override
    public void afterPropertiesSet() throws Exception {
        // 의존 관계 주입이 끝나면 호출
        System.out.println("NetworkClient.afterPropertiesSet");
        connect();
        call("초기화 연결 메시지");
    }

    @Override
    public void destroy() throws Exception {
        // 스프링 빈이 종료되기 직전
        System.out.println("NetworkClient.destroy");
        disConnect();

    }
}

[초기화 소멸 인터페이스 단점]

[참고]

<aside> ❗

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

@Configuration
    static class LifeCycleConfig {

        @Bean(initMethod = "init", destroyMethod = "close")
        public NetworkClient networkClient() {
            NetworkClient networkClient = new NetworkClient();
            networkClient.setUrl("<http://hello-spring.dev>");
            return networkClient;
        }
    }

[설정 정보 사용 특징]

[종료 메서드 추론]

AutoCloseble 찾아서 공부해볼 것

</aside>

<aside> ❗

!! 세 가지 중에 이 방법을 사용해라

애너테이션 @PostConstruct, @PreDestory

@PostConstruct
    public void init() throws Exception {
        // 의존 관계 주입이 끝나면 호출
        System.out.println("NetworkClient.init");
        connect();
        call("초기화 연결 메시지");
    }

    @PreDestroy
    public void close() throws Exception {
        // 스프링 빈이 종료되기 직전
        System.out.println("NetworkClient.close");
        disConnect();
    }

정리