Spring에서 Bean을 정의할 때, Bean의 scope를 선언할 수 있는 option이 있습니다. 예를 들어서, bean instance를 매번 필요할 때마다 생성되게 하고 싶은 경우 scope 설정을 prototype으로 두면 됩니다. 또, Spring이 매번 bean instance를 호출할 때마다 같은 bean instance를 return하게 하고 싶은 경우, bean scope 설정을 singleton으로 하면 됩니다.
Spring Framework는 다음 다섯가지의 scope들을 제공합니다.
Scope | Description |
---|---|
singleton | Spring IoC Container가 하나의 instance를 만들어 사용합니다. |
prototype | 하나의 Bean definition으로 여러개의 객체 instance들을 만들 수 있습니다. |
request | 이 scope 옵션은 HTTP request에 대한 것입니다. web-aware Spring ApplicationContext에서만 유효합니다. |
session | 이 scope 옵션은 HTTP session에 대한 것입니다. web-aware Spring ApplicationContext에서만 유효합니다. |
global-session | 이 scope 옵션은 HTTP global session에 대한 것입니다. web-aware Spring ApplicationContext에서만 유효합니다. |
다음은 scope 속성의 singleton과 prototype 값을 테스트한 예제입니다.
- Beans.xml
: singleton를 테스트하기 위한 Bean 객체와 prototype을 테스트하기 위한 Bean 객체를 각각 정의하였습니다 (helloWorld는 무시하셔도 됩니다).
- SingletonTest.java와 PrototypeTest.java
: 두 클래스는 message라는 속성과 이에 대한 setter와 getter를 가지고 있습니다. 다만 getter는 message를 return하는 것이 아닌, console에 출력되는 방식으로 message 속성 값을 확인할 수 있습니다.
- MainApp.java
: Beans.xml을 통해서 ApplicationContext 인스턴스를 만듭니다. 그리고 SingletonTest, PrototypeTest 클래스의 객체를 각각 2개씩 만들어서, 먼저 만든 instance의 message 속성값을 setMessage()를 통해서 바꿨을때 그 바뀐 값이 공유되는지 확인합니다.
: singleton은 instance가 1개이니 바뀐 값으로 출력이 되고, prototype은 instance가 2개 만들어질태니 다른 값으로(default 설정값) 출력이 되겠지요.
- 결과 화면
'Spring' 카테고리의 다른 글
Spring Bean Post Processor (0) | 2017.02.27 |
---|---|
init-method와 destroy-method 속성 (0) | 2017.02.26 |
Bean Definition (0) | 2017.02.24 |
Spring IoC Container (0) | 2017.02.24 |
Why do Java Webapps use .do extension? (0) | 2016.10.10 |