- 기본적으로 스프링의 모든 bean은 싱글턴이다.
- 즉, ApplicationContext.getBean() 함수는 항상 동일한 인스턴스를 반환한다.
- 하지만 ApplicationContext.getBean()을 호출할 때마다 새로운 인스턴스를 생성하도록 변경할 수도 있다.
- 싱글턴과 비싱글턴의 변환은 간단하고 자유롭게 수행할 수 있다.
- 구성 파일에서 bean의 scope 속성을 prototype으로 설정하면 비싱글턴 bean이 된다.
<beans...>
<bean id="nonSingleton" class="com.apress...Singer"
scope="prototype" c:_0="John Mayer" />
</beans>
...
// 구성파일에 컴포넌트 스캔이 없으면 애노테이션은 무시된다.
@Component(“nonSingleton”)
@Scope(“prototype”)
public class Singer {
private String name = "unknown";
public Singer(@Value("John Mayer") String name) {
this.name = name;
}
}
싱글턴을 사용해야 하는 시나리오
- 상태가 없는 공유 객체인 경우
- 읽기 전용 상태를 갖는 공유 객체인 경우
- 공유 상태를 갖는 공유 객체인 경우
- 쓰기 가능 상태를 갖는 대용량 처리 객체
비싱글턴을 고려해야 하는 시나리오
- 쓰기 가능한 상태를 갖는 객체
- private 상태를 갖는 오브젝트
bean 스코프 종류 (스프링 4 이상에서 지원)
- 싱글턴(Singleton) : 스프링의 디폴트 스코프. 스프링 IoC 컨테이너당 하나의 객체만 생성됨
- 프로토타입(Prototype) : 애플리케이션에서 요청할 때마다 새 인스턴스가 생성됨
- 요청(Request) : 웹 애플리케이션에서 스프링 MVC 사용 시 모든 HTTP 요청이 있을 때 생성되고 요청 처리가 완료되면 소멸됨
- 세션(Session) : 웹 애플리케이션에서 스프링 MVC 사용 시 모든 HTTP 세션이 시작되면 생성되고 세션이 끝나면 소멸됨
- 글로벌 세션(Global Session) : 동일한 스프링 MVC 기반 포털 애플리케이션 내의 모든 포틀릿 간에 공유됨
- 스레드(Thread) : 새로운 스레드에 의해 요청될 때 새로운 인스턴스가 생성되며 동일한 스레드 내에서는 같은 인스턴스가 사용됨
- 사용자 정의(Custom) : org.springframework.beans.factory.config.Scope 인터페이스를 구현하고 스프링 구성에서 사용자 정의 스코프를 등록하여 사용함