0%

빈 라이프사이클

스프링 컨테이너는 다음의 두 가지 방식을 이용해서 빈의 라이프사이클을 관리할 수 있다.

  • 스프링이 제공하는 특정 인터페이스를 상속받아 빈을 구현한다
  • 스프링 설정에서 특정 메서드를 호출하라고 지정한다

빈 라이프사이클 개요

다음 네 단계를 거친다.
객체생성/프로퍼티 설정 -> 초기화 -> 사용 -> 소멸

bean_lifecycle

InitializingBean / DisposableBean 인터페이스

초기화과정/소멸과정 에서 실행될 메소드를 정의 한다. 빈 객체 생성 이외의 추가적인 초기화 작업이 필요할 때 해당 인터페이스를 구현해 사용한다. 전형적인 예가 데이터베이스 커넥션풀 기능이 있다.

@PostConstruct / @PreDestroy

각각 초기화과정/소멸 과정에서 실행될 메소드를 의미하며.. 위 InitializingBean / DisposableBean 과 내용이 같다. 다만 두 애노테이션을 사용하려면 CommonAnnotationBeanPostProcessor 전처리기를 스프링 빈으로 등록해 주어야 하는데, < context:annotation-config> 태그를 사용하면 된다.

커스텀 init 메서드와 커스텀 destroy 메서드

외부에서 제공 받은 라이브러리가 있는데, 이 라이브러리 클래스를 스프링 빈으로 사용해야 한다고 가정하다. 해당 클래스의 초기화를 위해 init() 메서드가 있는데 @PostConstruct 애노테이션이 없다. 또한 InitializingBean 인터페이스도 상속받지 않았을때 아래와 같이 사용할 수 있다.

XML 설정

1
<bean id="externalBean" class="com.external.ExternalClass" init-method="init" destroy-method="destroy" />

Java 설정

1
2
3
4
@Bean(initMethod = "init", destroyMethod = "destroy")
public ExternalClass externalClass() {
return new ExternalClass();
}

ApplicationContextAware / BeanNameAware 인터페이스

빈 내에서 컨테이너객체와 빈이름의 제어가 필요할 경우 사용. 위 인터페이스를 구현할 경우 초기화 과정에서 각각 컨테이너와 빈 이름을 전달 받는다.

1
2
3
4
5
6
7
8
@Component
public class SomeObject implements ApplicationContextAware {
private ApplicationContext context;

setApplicationContext(ApplicationContext context) {
this.context = context;
}
}

빈 객체 범위 (scope)

스프링의 빈은 범위를 갖는데, 주요 범위는 다음 두가지가 있다

  • 싱글톤 범위 : 별도의 설정을 하지 않으면 스프링은 빈 객체를 한번만 생성한다. 물론 명시적으로 넣어줄 수도 있다.

  • 프로토타입 범위 : 싱글톤의 반대로 매번 새로운 객체를 생성한다. 사용방법은 같으며 해당 속성값에 prototype을 입력한다. 스프링 컨테이너는 프로토타입 범위를 가진 빈의 초기화까지만 관리하므로, 컨테이너 종료시 생성된 프로토타입 빈 객체의 소멸 과정이 실행되지 않는다.

Reference : Spring 4.0 프로그래밍