스프링 빈의 라이프 사이클
생성자 주입에는 예외)
생성자는 객체를 만들때 이미 스프링 빈이 파라미터로 같이 들어와야함스프링 빈은 (객체 생성 → 의존관계 주입)이 끝난 후에 필요한 데이터를 사용할 준비가 완료된다.
→ 초기화 작업은 의존관계 주입이 모두 끝난 후에 호출해야 한다.
그렇다면 의존관계 주입이 끝나는 시점은 ?
스프링의 빈 생명주기 콜백 방법
InitializingBean
의 afterPropertiesSet()
메서드를 통해 초기화DisposableBean
의 destroy()
를 통해 소멸→ 스프링 전용 인터페이스로, 코드가 스프링 인터페이스에 의존하게 된다. 따라서 초기화/소멸 메서드의 이름을 변경할 수 없고 내가 코드를 고칠 수 없는 외부 라이브러리에 적용할 수 없다.
@Bean(initMethod = "init", destroyMethod = "close")
→ 스프링 빈이 스프링 코드에 의존하지 않고 메서드 이름을 내가 설정할 수 있다. 또한 코드를 사용하는 것이 아닌 설정 정보를 사용하는 것이므로 코드를 고칠 수 없는 외부 라이브러리에도 적용할 수 있다.
@Bean
의 destroyMethod
는 기본값이 (inferred)
(추론)이다.
추론이라는 이름 그대로 종료 메서드를 close
, shutdown
라는 이름의 메서드로 자동으로 호출한다.
→ 직접 스프링 빈으로 등록하면 종료 메서드를 따로 적지 않아도 동작하며, 추론 기능을 사용하기 싫을 경우 destroyMethod=""
와 같이 공백을 지정하면 된다.
@PostConstruct
초기화 메서드@PreDestroy
소멸 메서드→ 스프링에서 권장하는 방법으로 애노테이션 하나만 붙이면 된다. 스프링에 종속된 기술이 아닌 자바 표준이라 스프링 외에 다른 컨테이너에서도 작동하지만, 외부 라이브러리에는 적용이 불가능하다. 외부 라이브러리에 적용하려면 위의 방법을 사용!