빈 생명주기 콜백
객체 생성 -> 의존관계 주입
스프링은 의존관계 주입 완료 후, 스프링 컨테이너 종료 전 스프링 빈에게 콜백 메서드를 통해 초기화 시점을 알려줌.
이벤트 라이프사이클
스프링 컨테이너 생성
스프링 빈 생성
의존 관계 주입
초기화 콜백 사용: 빈 생성, 의존 관계 주입 완료 후 호출
소멸전 콜백: 빈 소멸 직전 호출
스프링 종료
객체 생성과 초기화를 분리하자.
생성자 - 필수 파라미터 정보 받아 메모리 할당. 객체 생성.
초기화 - 생성된 값을 활용 후 외부 커넥션을 연결함.
무거운 초기화 작업은 분리 시켜서 빼는 것 유지보수 관점에서 좋음. 너무 간단한 경우 생성자에서 사용 할 수 있겠지만 객체 생성시에 초기화 하는 것이 아니라 사용 시에 초기화 하는 느낌으로 사용.
인터페이스 InitializingBean, DisposableBean
public class NetworkClient implements InitializingBean, DisposableBean {
private String url;
public NetworkClient() {}
....
@Override
public void afterPropertiesSet() throws Exception {
connect();
call("초기화 연결 메시지");
}
@Override
public void destroy() throws Exception {
disConnect();
}
}
afterPropertiesSet(): 초기화 - 주입 완료 후 호출
destory():소멸 - 스프링 컨테이너 종료 후 호출
인터페이스에 구현되어 있어 이름 변경 불가능.
스프링 초창기에 나온 방법들. 많이 사용하지 않음.
빈 등록 초기화, 소멸 메서드
@Configuration
static class LifeCycleConfig {
@Bean(initMethod = "init", destroyMethod = "close")
public NetworkClient networkClient() {
NetworkClient networkClient = new NetworkClient();
networkClient.setUrl("http://hello-spring.dev");
return networkClient;
}
}
설정 파일에서 initMethod와 destroyMethod를 지정 해 준다.
메서드 이름을 자유롭게 줄 수 있고 스프링에 의존하지 않음.
설정 정보를 사용하기 때문에 코드를 고칠 수 없는 외부 라이브러리에서도 초기화, 종료 메서드를 적용 할 수 있음.
destoryMethod 속성에는 아주 특별한 기능이 있어서 기본 값이 (inferred)로 추론으로 등록 되어 있음. -- destoryMethod="" 공백으로 지정해서 호출되지 않도록 지정해서 사용 할 수도 있음.
close, shutdwon이라는 메서드를 자동 호출 해줌.
애노테이션 @PostConstruct, @PreDestroy
결론: 이 방법을 쓰자!
public class NetworkClient {
private String url;
public NetworkClient() {
System.out.println("생성자 호출, url = " + url);
}
...
@PostConstruct
public void init() {
System.out.println("NetworkClient.init");
connect();
call("초기화 연결 메시지");
}
@PreDestroy
public void close() {
System.out.println("NetworkClient.close");
disConnect();
}
}
컴포넌트 스캔과 잘 어울리는 최신 스프링에서 가장 권장하고 javax 패키지에 들어가 있는 자바 표준 기능임.
유일한 단점은 외부 라이브러리에는 적용하지 못하는 것이라 그럴 경우에는 위에서 배운 방법들을 사용하자.
'Spring' 카테고리의 다른 글
스프링 핵심 원리 기본편 - 챕터 9. 빈 스코프 (0) | 2023.04.02 |
---|---|
스프링 핵심 원리 기본편 - 챕터 7. 의존관계 자동 주입 (0) | 2023.03.26 |
스프링 핵심 원리 기본편 - 챕터 6. 컴포넌트 스캔 (0) | 2023.03.19 |
스프링 핵심 원리 기본편 - 챕터 5. 싱글톤 컨테이너 (0) | 2023.03.19 |
스프링 핵심 원리 기본편 - 챕터 4 (0) | 2023.03.12 |
댓글