책읽기

[스프링5 프로그래밍 입문][chap06] 빈 라이프사이클과 범위

pythaac 2022. 3. 10. 22:39

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;
}
  • 프로토타입 범위의 빈 라이프사이클
    • 프로토타입 범위를 갖는 빈은 완전한 라이프사이클을 따르지 않음
    • 스프링 컨테이너가 프로토타입 빈 객체를 생성, 프로퍼티 설정, 초기화 작업을 수행
    • 그러나 컨테이너 종료시 생성한 프로토타입 빈 객체의 소멸 메서드를 실행하지 않음