Open myeongho2 opened 1 year ago
빈 생명주기 콜백 시작
스프링 빈의 이벤트 Life Cycle
스프링은 의존관계 주입이 완료되면 스프링 빈에 콜백 메서드를 통해 초기화 시점을 알려주는 기능을 제공한다.
스프링 컨테이너 생성 -> 스프링 빈 생성 -> 의존관게 주입 -> 초기화 콜백 -> 사용 -> 소멸전 콜백 -> 스프링 종료
초기화 콜백: 빈이 생성되고, 빈의 의존관계 주입이 완료된 후 호출 소멸전 콜백: 빈이 소멸되기 직전에 호출
빈 생명주기 콜백 지원 방법
인터페이스(InitializingBean, DisposableBean)
InitializingBean 은 afterPropertiesSet() 메서드로 초기화를 지원한다. DisposableBean 은 destroy() 메서드로 소멸을 지원한다.
설정 정보에 초기화 메서드, 종료 메서드 지정
@PostConstruct, @PreDestroy 애노테이션 지원
결론 - @PostConstruct / @PreDestroy 애노테이션을 가급적 사용하도록 하고, 코드를 고칠 수 없는 외부 라이브러리를 초기화, 종료해야 하면 @Bean 의 initMethod , destroyMethod 를 사용하자
스프링 컨테이너 생성
-> 스프링 빈 생성
-> 의존관계 주입
-> 초기화 콜백: 빈이 생성되고, 빈의 의존관계가 주입이 완료된 호출
-> 사용
-> 소멸전 콜백: 빈이 소멸되기 직전에 호출
-> 스프링 종료
인터페이스(Initializing Bean, DisposableBean)
단점
스프링 전용 인터페이스라 스프링에 의존하게 된다.
내가 코드를 고칠 수 없는 외부 라이브러리에 적용할 수 없다.
=> 더 나은 방법이 있어서 잘 사용하지 않음
public class NetworkClient implements InitializingBean, DisposableBean {...}
설정 정보에 초기화 메서드, 종료 메서드 지정
장점
@Configuration
static class LifeCycleConfig {
@Bean(initMethod = "init", destroyMethod = "close")
public NetworkClient networkClient() {
NetworkClient networkClient = new NetworkClient();
networkClient.setUrl("http://hello-spring.dev");
return networkClient;
}
}
@PostConstruct, @PreDestroy 애노테이션 지원
장점
단점
public class NetworkClient {
@PostConstruct
public void init() {
System.out.println("NetworkClient.init");
connect();
call("초기화 연결 메시지");
}
@PreDestroy
public void close() {
System.out.println("NetworkClient.close");
disconnect();
}
}
빈 생명주기 콜백
스프링 빈의 라이프사이클
스프링 빈의 이벤트 라이프사이클
객체의 생성과 초기화를 분리하자
“정리”
@PostConstruct
,@PreDestroy
애노테이션을 사용@Bean
의initMethod
,destroyMethod
를 사용하자.