본문 내용은 초보 웹 개발자를 위한 스프링5 프로그래밍 입문(최범균)을 참고하고 있습니다.
스프링 컨테이너는 초기화와 종료라는 라이프 사이클을 갖는다.
ex)
// 1. 컨테이너 초기화
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(AppContext.class);
// 2. 컨테이너에서 빈 객체를 구해서 사용
Greeter g = ctx.getBean("greeter", Greeter.class);
String msg = g.greet("스프링");
System.out.println(msg);
// 3. 컨테이너 종료
ctx.close();
1. 컨테이너 초기화
위 코드에서 AnnotationConfigApplicationContext의 생성자를 이용하여 컨텍스트 객체를 생성하는데 이 시점에 스프링 컨테이너를 초기화한다.
스프링 컨테이너는 설정 클래스에서 정보를 읽어와 알맞은 빈 객체를 생성하고 각 빈을 연결(의존 주입)하는 작업을 수행한다.
2. 컨테이너에서 빈 객체를 구해서 사용
컨테이너 초기화가 완료되면 컨테이너를 사용할 수 있다. 컨테이너를 사용한다는 것은 getBean()과 같은 메소드를 이용해 컨테이너에 보관된 빈 객체를 구한다는 것을 뜻한다.
3. 컨테이너 종료
컨테이너 사용이 끝나면 close()메소드를 사용하여 컨테이너를 종료한다.
스프링에서 빈 객체의 라이프 사이클은 스프링 컨테이너가 관리한다. 다음은 빈 객체의 라이프 사이클이다.
스프링 컨테이너를 초기화할 때 1)스프링 컨테이너는 가장 먼저 빈 객체를 생성하고, 2)의존을 설정한다. 의존 자동 주입을 통한 의존 설정이 이 시점에 수행된다.
3)모든 의존 설정이 완료되면 빈 객체의 초기화를 수행한다. 빈 객체를 초기화하기 위해 스프링은 빈 객체의 지정된 메소드를 호출한다.
4)스프링 컨테이너를 종료하면 스프링 컨테이너는 빈 객체의 소멸을 처리한다. 이때에도 지정한 메소드를 호출한다.
빈 객체의 라이프 사이클 중 초기화와 소멸에서 지정한 메소드를 호출한다고 했다. 스프링은 다음의 두 인터페이스에 이 메소드를 정의하고 있다.
- org.springframework.beans.factory.InitalizingBean
- org.springframework.beans.factory.DisposableBean
두 인터페이스는 다음과 같다.
ex)
// 생성
public interface InitializingBean {
void afterPropertiesSet() throws Exception;
}
// 소멸
public interface DisposableBean {
void destroy() throws Exception;
}
InitializingBean 인터페이스와 DisposableBean 인터페이스를 구현할 수 없거나 두 인터페이스를 사용하고 싶지 않은 경우에는 스프링 설정에서 직접 메소드를 지정할 수 있다.
@Bean 태그의 initMethod 속성
빈 객체 초기화를 위한 속성으로 @Bean(initMethod = "초기화메소드이름") 이렇게 사용된다.
@Bean 태그의 destroyMethod 속성
빈 객체 소멸을 위한 속성을 @Bean(destroyMethod = "소멸메소드이름") 이렇게 사용된다.
빈 객체의 생성과 관리 범위
빈은 별도 설정을 하지 않는다면 싱글톤 범위를 갖는다.
@Scope("prototype")을 사용하면 해당 빈이 프로토타입 범위를 갖게 된다.
싱글톤 범위를 명시적으로 지정하고 싶다면 @Scope("singleton")을 사용해주면 된다.
프로토타입 범위를 갖는 빈은 객체의 소멸 메소드를 실행하지 않아 소멸 처리를 코드에서 직접 해줘야 한다.
'Back-end > Spring' 카테고리의 다른 글
MVC 핵심 구성 요소 (0) | 2021.10.01 |
---|---|
AOP 프로그래밍 (학습필요) (0) | 2021.10.01 |
컴포넌트 스캔(@Component, @ComponentScan) - 학습필요 (0) | 2021.10.01 |
의존 자동 주입 (0) | 2021.10.01 |
스프링 DI (0) | 2021.10.01 |