빈 스코프란?
빈이 존재할 수 있는 범위
스프링이 지원하는 다양한 스코프의 종류
- 싱글톤 : 기본 스코프, 스프링 컨테이너의 시작과 종료까지 유지되는 가장 넓은 범위의 스코프
- 프로토타입 : 스프링 컨테이너가 프로토타입 빈의 생성과 주입 및 초기화 까지만 관여하고 더 이상 관여하지 않는 매우 짧은 범위의 스코프 그러기 때문에 빈 종료메소드가 호출되지 않음
- 웹 관련 스코프
- request : 웹 요청이 들어오고 나갈때 까지 유지되는 스코프
- session : 웹 세션이 생성되고 종료될 때 까지 유지되는 스코프
- application : 웹의 서브릿 컨텍스와 같은 범위로 유지되는 스코프이다
컴포넌트 스캔 자동 등록
@Scope("prototype")
@Component
public class HelloBean {}
수동 등록
@Scope("prototype")
@Bean
PrototypeBean HelloBean() {
return new HelloBean();
}
프로토타입 스코프
프로토타입 스코프로 등록된 빈을 스프링 컨테이너에서 조회하면 스프링 컨테이너는 항상 새로운 인스턴스를 생성해서 반환한다.
오잉?! 스프링 컨테이너는 싱글톤 컨테이너 가 기본이라서 하나의 객체 만을 사용하고 조회 시 이 하나의 객체를 돌려줘야하는거 아닌가?!
헷갈릴 수 있는데 스프링 컨테이너는 무조건 싱글톤 은 아니다 기본이 싱글톤 방식이지만 이것을 프로토타입방식으로 변경할 수 있다, 즉 Optional 하다는 것이다.
그러므로 프로토타입을 사용할 시 매번 같은 개체가 아닌, 매번 다른 개체를 생성하게됩니다.
다시 한번! 짚고 넘어가기 스프링 컨테이너가 프로토타입 빈의 생성과 주입 및 초기화 까지만 관여 하기에 프로토타입 빈은 @PreDestroy 같은 종료 메서드가 호출되지 않는다!