스프링 빈의 라이프사이클
1. 객체 생성
2. 의존관계 주입
생성자 주입은 예외
(객체를 만들 때 스프링 빈이 같이 파라미터에 들어와야 하기 때문에)
스프링 빈의 이벤트 라이프사이클 (싱글톤)
1. 스프링 컨테이너 생성
2. 스프링 빈 생성
3. 의존관계 주입
4. 초기화 콜백
5. 사용
6. 소멸전 콜백
7. 스프링 종료
객체의 생성과 초기화를 분리
스프링은 크게 3가지 방법으로 빈 생명주기 콜백을 지원
InitializingBean
afterPropertiesSet() 메서드로 초기화를 지원DisposableBean
destroy() 메서드로 소멸을 지원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();
}
}
초기화, 소멸 인터페이스 단점
설정 정보에 @Bean(initMethod = "init", destroyMethod = "close")
처럼 초기화, 소멸 메서드를 지정
public class BeanLifeCycleTest {
...
@Configuration
static class lifeCycleConfig{
@Bean(initMethod = "init", destroyMethod = "close")
public NetworkClient networkClient(){
NetworkClient networkClient=new NetworkClient();
networkClient.setUrl("http://hello-spring.dev");
return networkClient;
}
}
}
public class NetworkClient{
...
public void init() throws Exception {
System.out.println("NetworkClient.init");
connect();
call("초기화 연결 메세지");
}
public void close() throws Exception {
System.out.println("NetworkClient.close");
disconnect();
}
}
설정 정보 사용 특징
종료 메서드 추론
@Bean
의 destroyMethod
속성은 close , shutdown 라는 이름의 메서드를 자동으로 호출 > 메서드를 추론해서 호출destroyMethod=""
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
public class NetworkClient{
...
@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();
}
}
대부분 @PostConstruct, @PreDestroy 애너테이션을 사용하고
외부 라이브러리를 초기화, 종료해야 하면 @Bean 의 initMethod , destroyMethod 를 사용