1. 컨테이너 초기화와 종료
- 스프링 컨테이너는 "초기화"와 "종료"라는 라이프 사이클을 가짐
// 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();
- 초기화
- AnnotationConfigApplicationContext 생성자를 이용하여 컨텍스트 객체 생성
- 이 때 스프링 컨테이너를 초기화
- 1) 설정 클래스에서 정보를 읽어 알맞은 빈 객체를 생성
- 2) 각 빈을 연결(의존 주입)하는 작업을 수행
- 컨테이너 사용
- 컨테이너 사용은 컨테이너에 보관된 빈 객체를 구한다는 것
- 종료
- close() 메서드를 통해 종료
- AbsractApplicationContext#close()
- 빈 객체가 소멸됨
2. 스프링 빈 객체의 라이프사이클
1) 스프링 빈의 라이프 사이클
- 스프링 컨테이너가 빈 객체의 라이프사이클을 관리
- (1)객체 생성 -> (2)의존 설정 -> (3)초기화 -> (4)소멸
- 스프링 컨테이너 초기화
- 컨테이너 초기화시 (1)빈 객체를 생성하고 (2)의존을 설정
- 모든 의존 설정이 완료되면 (3)빈 객체의 초기화를 수행
- 스프링 컨테이너 종료
- 컨테이너 종료시 빈 객체의 소멸을 처리
2) 빈 객체의 초기화와 소멸 : 스프링 인터페이스
- 빈 객체를 초기화하고 소멸하기 위해 빈 객체의 지정한 메서드를 호출
- org.springframework.beans.factory.initializingBean
- org.srpingframework.beans.factory.DisposableBean
public interface InitializingBean{
void afterPropertiesSet() throws Excption;
}
publicinterface DisposableBean{
void destroy() throws Exception;
}
- 초기화
- 빈 객체가 InitializingBean을 구현하면
- 스프링 컨테이너 초기화 과정에서
- 빈 객체의 afterPropertiesSet() 메서드를 실행
- 빈 객체를 생성한 뒤에 초기화 과정이 필요할 때 사용
- 소멸
- 초기화와 마찬가지
- 초기화와 소멸 과정이 필요한 예
- 데이터베이스 커넥션
- 채팅 클라이언트
3) 빈 객체의 초기화와 소멸 : 커스텀 메서드
- @Bean(initMethod= ,destroyMethod= )
- 직접 구현한 클래스가 아닌 외부에서 제공받은 클래스를 스프링 빈 객체로 설정하고 싶을 때
- 스프링 설정에서 직접 메서드를 지정할 수 있음
// 빈 객체
public class Client2 {
private String host;
public void setHost(String host) {
this.host = host;
}
public void connect(){
System.out.println("Clinet2.connect() 실행");
}
public void send(){
System.out.println("Client2.send() to " + host);
}
public void close(){
System.out.println("Client2.close() 실행");
}
}
// 설정 파일의 빈
@Bean(initMethod="connect", destroyMethod="close")
public Client2 client2(){
Client2 client = new Client2();
client.setHost("host");
return client;
}
- 중복 호출 주의
- [시나리오] 위 Client2가 InitializingBean을 상속
- [시나리오] client2()에서 afterPropertiesSet을 호출하면
- 중복 호출됨
3. 빈 객체의 생성과 관리 범위
- 싱글톤 범위
- 한 식별자에 대해 한개의 객체만 존재하는 빈
- 스프링은 기본으로 싱글턴 범위
- 프로토타입 범위
- 빈 객체를 구할 때마다 매번 새로운 객체를 생성
- @Scope("singleton")도 가능
@Bean
@Scope("prototype")
public Client clinet(){
Client clinet = new Client();
client.setHost("host");
return client;
}
- 프로토타입 범위의 빈 라이프사이클
- 프로토타입 범위를 갖는 빈은 완전한 라이프사이클을 따르지 않음
- 스프링 컨테이너가 프로토타입 빈 객체를 생성, 프로퍼티 설정, 초기화 작업을 수행
- 그러나 컨테이너 종료시 생성한 프로토타입 빈 객체의 소멸 메서드를 실행하지 않음
'책읽기' 카테고리의 다른 글
[스프링5 프로그래밍 입문][chap05] 컴포넌트 스캔 (0) | 2022.03.10 |
---|---|
[스프링5 프로그래밍 입문][chap04] 의존 자동 주입 (0) | 2022.03.08 |
[스프링5 프로그래밍 입문][chap03] 스프링 DI (0) | 2022.03.04 |
[스프링5 프로그래밍 입문][chap01/chap02] 들어가며/스프링 시작하기 (0) | 2022.02.04 |
[파이썬 알고리즘 인터뷰] 14장 - 트리 (0) | 2021.09.13 |