참고 도서 : 스프링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) 외부 제공 클래스를 스프링 빈 객체로 설정할 경우,
해당 클래스 내부에서 두 인터페이스를 구현, 수정할 수 없다.
-스프링 설정에서 직접 (초기화/소멸) 메소드 지정해야 한다.
-@Bean의 initMethod 속성(초기화), 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
-따라서 프로토타입 빈 사용 시, 빈 객체 소멸 처리를 코드에 직접 처리 필요함
'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 |