- 특정 빈을 Spring에 등록하고, 그 빈의 의존관계가 주입된 후(완전히 생성된 후) 무언가 작업을 하고,
삭제 전에 어떤 작업을 하고 싶을 때가 있다. 기본적으로@PostConstruct
,@PreDestroy
사용을 하면 된다.
- 그러나 외부 라이브러리를 사용할 때도 있는데, 이럴 때는 내부 코드를 수정할 수 없으므로
수동으로 @Bean 등록시에 특정 메서드의 이름을 생성후, 소멸전 메서드로 등록을 해줘야 한다.
스프링 빈의 라이프 사이클
기본적인 @PostConstruct
, @PreDestroy
의 동작 시점은 아래와 같다.
스프링 컨테이너 생성 -> 스프링 빈 생성 -> 의존관계 주입 ->
@PostConstruct
-> 사용로직 ->@PreDestroy
-> 스프링 종료
// 기본 어노테이션 사용법
@PostConstruct
public void init() throws Exception {
//의존 관계 주입이 끝나면 호출
System.out.println("NetworkClient.afterPropertiesSet");
connect();
call("초기화 연결 메세지");
}
@PreDestroy
public void close() throws Exception {
System.out.println("NetworkClient.destroy");
disconnect();
}
특정 라이브러리에서 생명주기에 맞춰 사용법(@Bean(initMethod = "init",destroyMethod = "beforeDestroy")
)
- 보통 외부 라이브러리를 사용하면,
@PostConstruct
,PreDestroy
시점에 호출해줘야 할 경우가 생긴다. - 그럴 때 외부 라이브러리를 @Configuration 파일의 @Bean으로 등록하면서, 특정 메서드를 호출해달라고 이름으로 설정해줄 수 있다.
사용법
@Configuration
static class LifeCycleConfig {
************************************************************
@Bean(initMethod = "init",destroyMethod = "beforeDestroy")
************************************************************
public NetworkClient networkClient() {
NetworkClient networkClient = new NetworkClient();
networkClient.setUrl("http://hello-spring.dev");
return networkClient;
}
}
- 외부 라이브러리의 사용법에 맞춰 메서드명만 맞춰주면 된다.
💥 Bean의
destroyMethod
는 추론이라는 기능이 내장되어 있는데,close
,shutdown
이름의 메서드를 자동으로 추적하여 종료 직전에 호출해준다.
설정하지 않아도 작동된다고 놀라지 말자!