2013-07-23 3 views
0

나는 스프링 MVC 애플리케이션을 가지고있다. 나는 싱글 톤 (singleton)과 유선 (autowired)하지만 요구 범위의 필드 인 유선을 가지고있다. 예를 들어 :@autowired 필드와 @autowired 생성자

여기
class Hello { 

    @Autowired 
    BDepend b; // this is defined as a request scope bean 

    @Autowired 
    public Hello(ADepend a){ 
    } 
} 

내 수업 안녕하세요 싱글이지만 BDepend는 요청 범위 객체입니다. 안녕하세요는 싱글 톤이므로 BDE는 각 요청에 대해 스프링이 올바른 인스턴스를 처리하는 방법을 설명합니다.

답변

1

기본적으로 응용 프로그램 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" /> 
    
    다양한 프록시 시스템을 범위 : 그것은 빈에서 다른 범위를 가지고 있다는 것을 코드에서 알 수 있습니다.

  • +0

    놀랍게도 스프링이 올바르게 처리하고 있습니다. 내 요청에 대해 내 클래스의 싱글 톤 개체와 BDepend의 올바른 인스턴스가 있음을 알 수 있습니다. 나는 봄이 이것을 어떻게 다루고 있는지 알고 싶었다. –

    +0

    범위가 지정된 프록시를 통해 bean을 사용할 수 있습니다. Hello 인스턴스가 싱글 톤인 것이 확실합니까? 어떤 버전의 스프링을 사용합니까? –