기본적으로 응용 프로그램 sturtup에서 런타임 예외가 발생합니다. 이런 식으로 뭔가 :
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'b': Scope 'request' is not active for the current thread; consider defining a scoped proxy for this bean if you intend to refer to it from a singleton;
요청 범위를 사용하려면 당신이 신선한 instace에게 애플리케이션 컨텍스트에서 각 시간을 확보 할 몇 가지 싱글의 내부 객체. 애플리케이션 컨텍스트 직접
class Hello {
@Autowired
private ApplicationContext ctx;
@Autowired
public Hello(ADepend a){
}
public useB(){
BDepend instance = ctx.getBean(BDepend.class);
instance.doSomething();
}
}
를 사용
또는 javax.inject.Provider
를 통해 새로운 인스턴스를 얻을 : 당신은 그것을 할 수 있습니다.
class Hello {
@Autowired
private Provider<BDepend> provider;
@Autowired
public Hello(ADepend a){
}
public useB(){
BDepend instance = this.provider.get();
instance.doSomething();
}
}
또는이 콩에 대한 범위의 프록시를 선언는 :
@Component
@Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS)
class BDepend {
}
class Hello {
@Autowired
private BDepend b;
@Autowired
public Hello(ADepend a){
}
public useB(){
b.doSomething();
}
}
또는 사용은 개인적으로 내가 두 번째 옵션 (javax.inject.Provider
)를 선호
<context:component-scan base-package="com.mycompany.beans" scoped-proxy="targetClass" />
다양한 프록시 시스템을 범위 : 그것은 빈에서 다른 범위를 가지고 있다는 것을 코드에서 알 수 있습니다.
놀랍게도 스프링이 올바르게 처리하고 있습니다. 내 요청에 대해 내 클래스의 싱글 톤 개체와 BDepend의 올바른 인스턴스가 있음을 알 수 있습니다. 나는 봄이 이것을 어떻게 다루고 있는지 알고 싶었다. –
범위가 지정된 프록시를 통해 bean을 사용할 수 있습니다. Hello 인스턴스가 싱글 톤인 것이 확실합니까? 어떤 버전의 스프링을 사용합니까? –