Bean 범위(scope)
스프링은 기본적으로 컨테이너에 한 개의 빈 객체를 생성한다. 경우에 따라서 getBean() 메서드를 호출할 때마다 빈 객체를 매번 생성하고 싶은 경우에는 빈의 범위를 설정하는 방법으로 할 수 있다.
<bean id="memory" class="com.zend4u.crawler.memory" scope="singleton">...</bean>
scope 속성
범위 |
설명 |
singleton |
스프링 컨테이너에 한 개의 빈 객체만 존재한다 (기본값) |
prototype |
빈을 사용할 때 마다 객체를 생성한다. |
request |
HTTP요청 마다 빈 객체를 생성한다. WebApplicationContext에서만 적용 가능 |
session |
HTTP 세션마다 빈 객체를 생성한다. WebApplicationContext에서만 적용 가능 |
global-session |
글로벌 HTTP 세션에 대해 빈 객체를 생성한다. 포틀릿을 지원하는 컨텍스트에 대해서만 적용 가능하다. |
<aop:scoped-proxy> 태그를 사용하려면 aop 네임스페이스 및 스키마 위치를 지정해주어야 하고 <aop:scoped-proxy>태그를 <bean>태그에 설정하면, 스프링은 범위에 알맞은 빈 객체에 접근할 수 있도록 해주는 프록시 객체를 생성한다.
자신보다 생명주기가 더 긴 객체의 의존 객체로 설정되는 경우에는 prototype범위의 빈 객체가 singleton 범위의 빈 객체로부터 참조되는 경우 유용하게 사용할 수 있다.
<bean id="worker" class="com.zend4u.Crawler.Worker" scope="prototype"> <!-- prototype : 매번 새로운 인스턴스를 생성 -->
<aop:scoped-proxy />
</bean>
<bean id="worker" class="com.zend4u.Crawler.Executor"> <!-- default : singletone -->
<property name="worker" ref="worker" />
</bean>
public class Executor {
private Worker worker;
public void setWorker(Worker worker) {
this.worker = worker; //<aop:scoped-proxy>를 통해 생성된 프록시 객체
}
public void execute(WorkUnit work) {
worker.work(work); //내부적으로 매번 새로운 Worker객첵가 생성됨.
}
}
* <aop:scoped-proxy>태그를 사용하려면 CGLIB 라이브러리를 클래스패스에 추가해 주어야 한다.
'프로그래밍 > Spring' 카테고리의 다른 글
@Autowired 어노테이션 (0) | 2018.12.18 |
---|---|
@Required 어노테이션 (0) | 2018.12.18 |
스프링(Spring) 컨테이너 (0) | 2018.12.17 |
AOP(Aspect Oriented Programming)와 스프링(Spring) (0) | 2018.12.17 |
스프링(Spring) 프레임워크 & DI(Dependency Injection)패턴 (0) | 2018.12.17 |