ch06. 빈 라이프사이클과 범위

728x90
참고 도서 : 스프링5 프로그래밍 입문 - 최범균 저

ch06. 빈 라이프사이클과 범위

[스프링 컨테이너 라이프사이클] : 생명주기

: 컨테이너 초기화 -> 사용 -> 컨테이너 종료

//1. 컨테이너 초기화
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(설정클래스.class);


//2. 컨테이너에서 빈 객체 구해서 사용
Greeter g = ctx.getBean("greeter", Greeter.class);
... (빈 객체 사용)


//3. 컨테이너 종료
ctx.close();

스프링 컨테이너 초기화

-AnnotationConfigApplicationContext의 생성자를 이용해 컨테이너 객체 생성 시,

스프링 컨테이너의 초기화가 이뤄진다.

-이때, 스프링 컨테이너는 설정 클래스에서 정보 읽어와 알맞은 빈 객체 생성 후 각 빈 의존 주입하는 작업 수행한다.

스프링 컨테이너 사용

-사용: 컨테이너에 보관된 빈 객체를 구하여 사용하는 것

스프링 컨테이너 종료 : close()

-사실 상 close()AbstractApplicationContext 클래스에 정의되어있지만,

자바 설정 시 사용하는 (AnnotationConfigApplicationContext) XML 설정 시 사용하는 (GenericXmlApplicationContext) 가 위의 클래스를 상속받고 있으므로 close()를 통해 컨테이너 종료 가능하다.

*스프링 컨테이너의 라이프사이클에 따라 빈 객체도 생성과 소멸이라는 라이프사이클을 갖는다.

[빈 객체 라이프 사이클]

: 객체 생성 -> 의존 설정 -> 초기화 -> 소멸

스프링 컨테이너 초기화 빈 객체 생성
의존 설정
빈 객체 초기화
스프링 컨테이너 사용  
스프링 컨테이너 종료 빈 객체 소멸

 

<스프링 컨테이너 초기화와 동시에>

-빈 객체 생성 -> 의존 설정 -> 초기화

                           // 스프링은 빈 객체 초기화 위해, 지정된 메소드 호출

<스프링 컨테이너 종료 이후>

-빈 객체 소멸

                           //스프링은 빈 객체 소멸 위해, 지정된 메소드 호출

 

[빈 객체 초기화/소멸]

스프링 인터페이스

-스프링은 빈 객체 초기화/소멸을 위해 지정한 메소드를 호출한다.

-그 메소드를 다음의 두 인터페이스에서 정의하고 있다

-스프링 컨테이너는 빈 객체 생성 마무리한 뒤에 빈 객체 초기화 메소드를 실행

-스프링 컨테이너를 종료하면 가장 마지막에 destory() 메소드 실행

, 컨테이너 종료 과정 거치지 않으면 -> 빈 객체 소멸 과정도 실행 X

[InitializingBean] 인터페이스 : 빈 객체 초기화 메소드 정의
                           afterPropertiesSet() 메소드
[DisposableBean] 인터페이스 : 빈 객체 소멸 메소드 정의
                              destory() 메소드

 

-빈 객체가 자기 클래스 내부에서 InitializingBean 인터페이스를 구현하면

스프링 컨테이너 초기화 과정에서 빈 객체의 afterPropertiesSet() 메소드를 실행한다.

- InitializingBean 상속 후 해당 메소드 재정의하여 사용

 

-빈 객체가 자기 클래스 내부에서 DisposableBean 인터페이스를 구현하면

스프링 컨테이너 종료하면 빈 객체의 destory() 메소드 호출한다.

DisposableBean 상속 후 해당 메소드 재정의하여 사용

 

커스텀 메소드

-(직접 구현X) 외부 제공 클래스를 스프링 빈 객체로 설정할 경우,

해당 클래스 내부에서 두 인터페이스를 구현, 수정할 수 없다.

 

-스프링 설정에서 직접 (초기화/소멸) 메소드 지정해야 한다.

-@BeaninitMethod 속성(초기화), destoryMethod 속성(소멸)에 초기화/소멸 메소드 이름 직접 지정하면 된다.

@Bean(initMethod = "초기화메소드이름", destoryMethod = "소멸메소드이름")
public Client2 client2() {
...
}

 

*자바 설정 클래스 자체가 자바 코드이므로 (초기화의 경우만)

직접 빈 설정 메소드 내부에서 초기화를 수행해도 된다.

, 설정 코드에서 초기화 메소드 직접 실행 시 주의할 점 = 초기화 메소드 두 번 호출 주의

ex. 이미 인터페이스 구현한 빈 객체에 대해 또 직접 초기화 코드 작성X

 

[빈 객체 생성/관리 범위 지정] : @Scope(“__”)

싱글톤 범위

-스프링 컨테이너는 빈 객체를 한 개만 생성

=매번 새로운 객체 생성X, 한 종류의 객체를 다시 생성O

-기본적으로 빈은 싱글톤 범위를 갖는다.

 

<명시적으로 싱글톤 범위 지정>

@Bean
@Scope("singleton") //지정
public Client2 client2() {
...
}

 

프로토타입 범위

빈 범위를 프로토타입으로 설정할 경우, 빈 객체는 매번 새 객체 생성 O, 다른 종류의 객체

@Bean
@Scope("prototype")//지정
public Client2 client2() {
...
}

 

*, 프로토타입 범위 갖는 빈은 완전한 라이프사이클 따르지 X

스프링 컨테이너는 프로토타입 빈 객체 생성,설정,초기화 작업 수행O

소멸 작업 수행X

-따라서 프로토타입 빈 사용 시, 빈 객체 소멸 처리를 코드에 직접 처리 필요

 

728x90

'Web(웹)_관련 공부 모음 > [개념]_스프링 5 프로그래밍' 카테고리의 다른 글

ch08. DB 연동  (0) 2022.01.28
ch07. AOP 프로그래밍  (0) 2022.01.27
ch05. 컴포넌트 스캔  (0) 2022.01.26
ch04. 의존 자동 주입  (0) 2022.01.26
ch03. 스프링 DI  (0) 2022.01.25