스프링 빈 생명주기
빈 생명주기 콜백
-
스프링 컨테이너 생성:
AnnotationConfigApplicationContext등을 통해 컨테이너 생성 -
스프링 빈 등록: 설정 클래스나 컴포넌트 스캔을 통해 빈을 생성하고 등록
-
의존관계 주입: 생성자 주입은 빈을 만드는 시점에 의존관계가 주입되지만, 수정자(Setter) 주입이나 필드(@Autowired) 주입은 빈 생성 이후 별도의 단계에서 의존관계 주입 발생
-
초기화 콜백: 빈에 의존관계 주입이 완료된 후, 사용자가 정의한 콜백 메서드를 통해 빈의 초기화 작업을 실행
-
사용: 애플리케이션에서 빈 참조
-
소멸 전 콜백: 스프링 컨테이너가 종료되기 직전, 사용자가 정의한 빈이 소멸에 필요한 작업을 콜백으로 수행
-
스프링 종료: 컨테이너가 완전히 소멸
초기화, 소멸 메서드 선언 시 인터페이스를 사용하는 경우
- 초기화:
InitializingBean-afterPropertiesSet메서드 구현 - 소멸:
DisposableBean-destroy메서드 구현
인터페이스를 사용했을 때 단점
- 스프링 전용 인터페이스로 스프링 프레임워크에 의존적이다.
- 초기화, 소멸을 위한 구현 메서드의 명칭을 변경할 수 없어 행위에 대한 의미를 부여하기 어렵다.
💡 스프링 초창기에 등장한 초기화와 소멸 방법으로 현재로서는 잘 사용되지 않는다.
초기화, 소멸 메서드를 빈으로 이름을 지정하는 방법
@Bean(initMethod = "init", destroyMethod = "close")
장점
- 메서드 이름을 자유롭게 변경할 수 있다.
- 스프링 빈이 스프링 코드에 의존적이지 않고, 설정 정보에게 위임한다.
단, destroyMethod = “(inferred)” 으로 지정된 기능이 존재하는데 close, shutdown 같은 이름의 메서드를 자동으로 호출해주는 추론 방식이다.
추론 기능을 사용하고 싶지 않다면 destroyMethod="" 로 지정하면 자동으로 소멸 콜백 메서드를 실행 시키는 것을 예방할 수 있다.
초기화, 소멸 메서드 선언 시 어노테이션을 활용 하는 방법 (권장)
@PostConstruct
public void init() {
System.out.println("NetworkClient.init");
connect();
call("초기화 연결 메시지");
}
@PreDestroy
public void close() {
System.out.println("NetworkClient.close");
disconnect();
}
- 자바 표준이기 때문에 스프링에 의존적이지 않다.
특징
단, 외부 라이브러리 같이 수정할 수 없는 환경에서 어노테이션을 추가할 수 없기 때문에 활용할 수 없다.
이럴 땐 Bean 어노테이션에 initMethod, destroyMethod 를 지정하는 방식을 이용하여 해결할 수 있다.