스프링 빈의 라이프사이클은 객체 생성 후 의존관계주입
의존관계 주입까지 다 끝나야 데이터를 사용할 수있는 준비가 완료됨.
그래서 스프링은 의존관계 주입이 완료되면 빈에게 콜백 메서드를 통해 초기화 시점을 알려주는 다양한 기능 제공.
그리고 소멸전에도 콜백 존재함.
빈의 이벤트 라이프 사이클은
스프링 컨테이너 생성 -> 빈 생성 -> 의존관계 주입 -> 초기화 콜백 -> 사용 -> 소멸 전 콜백 -> 스프링 종료
객체의 생성과 초기화는 불리하는 것이 좋다.
생성자는 필수정보를 파라미터로 바도, 메모리를 할당해서 객체를 생성하는 책임을 가진다. 초기화는 생성된 값들을 활용해서 외부 커넥션을 연결하는 등 무거운 동작을 수행한다.
따라서 무거운 동작은 별도의 메서드에서 수행하는 것이 유지보수 관점에서 더 좋은 방법임.
(의도적으로 지연)
--------------------------------------------
스프링은 3가지 방법으로 빈 생명주기 콜백을 지원한다.
- 인터페이스 : Initializing Bean, Disposable Bean
방법 : 위 인터페이스들을 implements하고 초기화, 소멸 메소드를 오버라이딩한다.
단점
: 초기화, 소멸 메소드의 이름 변경 불가능
: 해당 코드가 스프링 전용 인터페이스에 의존하게 됨
: 내가 코드를 고칠 수없는 외부 라이브러리에 적용할 수 없다.
- 빈 등록 초기화, 소멸 메서드
방법 : 설정 정보에 @Bean(initMethod = "init", destroyMethod = "close") 와 같이 작성
특징
: 메서드 이름을 자유롭게 할 . 수있음
: 스프링 빈이 스프링 코드에 의존하지 않음
: 코드가 아니라 설정정보를 사용하므로 외부 라이브러리에도 적용 가능
종료메서드 추론
라이브러리는 대부분 close, shutdown 이라는 이름의 종료 메서드를 사용함, 그래서 추론기능을 통해 close, shutdown 이라는 이름의 메서드를 자동으로 호출해준다.
단, 공백문자열로 지정해놓으면 추론기능을 수행하지 않음.
- 애노테이션 @PostConstruct, @PreDestroy
방법 : 초기화, 소멸 메서드에 애노테이션만 붙이면 됨
특징
: 스프링에 종속적인 기술이 아님, 자바표준 방법임. 따라서 스프링이 아닌 다른 컨테이너에서도 동작함.
: 컴포넌트 스캔과 잘 어울림.
단점
: 외부 라이브러리에 적용불가능, 외부라이브러리에 초기화, 종료를 넣으려면 2번 방법을 사용