본문 바로가기
프로그래밍/Spring

Bean 범위(scope)

by Mr-후 2018. 12. 18.
반응형

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 라이브러리를 클래스패스에 추가해 주어야 한다. 



반응형