2013-06-25 5 views
1

나는이 executor가 두 개의 클래스로 나눠 져야한다. 하나는 세션 스코프이고 다른 하나는 싱글 톤이다. 그래서 나는 @Autowired annotation을 사용하여 양쪽 모두에 주입한다. , 그것은 아주 잘 작동하지만 세션 빈에 대해서 집행자는 모든 세션에 대해서 하나 뿐이며, 이것이 어떻게 작동하는지 이해합니다.스프링 빈 범위는 autowired 콩의 클래스로

executor가 주입 된 bean의 범위를 어떻게 만들 수 있습니까? 이제 내가 할 수있는 것은 각각 서로 다른 두 개의 클래스를 사용하는 것입니다.

의 설정 효과가 <context-component-scan />에서 targetClass 인 사실을 저는 거의 알지 못합니다.

편집 여기

프로토 타입 범위 내 시도 밖으로 :

이 내 세션 콩을

@Component 
    @Scope("session") 
    public class WebExecutor(){ 

     @Autowired 
     private ExecutorService executor; 

     @Async 
     public void startCalc(){ 
      executor.start("now"); 
     } 

    } 

을 soped입니다 가정은 그리고 이것은 내 ExecutorService를 클래스입니다

@Component 
@Scope("prototype") 
public class ExecutorService{ 

    private int progress; 

    public void start(String when){ 
     //do some stuff and increment the progress 
    } 

    //getter and setter for progress 
} 

또 다른 콤보도 있습니다. executor를 autowire하는 기본 싱글 톤 스코프를 가지고 있기 때문에 executor는 세션 스코프가 될 수 없다.

그래서 이제는 클래스가 자동으로 채워지는 bean의 범위가 필요하므로 프로토 타입 범위를 시도했습니다. 이 웹 버전에서 작동하는 방법을

당신은 그럼 나는를 사용하여 ExecutorService입니다에서 진행을 얻을 WebExecutor

  • 의 방법의 시작을 호출 실행을 시작하는 링크를 클릭하여이

    1. 같다 WebParser를 선택하고 사용자에게 전달하여 진행 상황을보고합니다.

    이 프로토 타입 전에 좋은 일하고 있지만, ExecutorService를 모든 세션에 대한 하나,

    를 그래서 나는 프로토 타입을 사용하지만 지금은 진보는 항상 0이고, 나는 실행 프로그램을 디버깅 할 때 나는 그것이 증가하는 것을 발견 그러나 사실상 WebExecutor는 증가를 볼 수 없었습니다.

  • 답변

    0

    U는 prototype 범위를 사용할 수 있습니다. 그런 다음 Bean이 생성 될 때 Executor의 새 인스턴스를 주입합니다. 따라서 Executor은 빈이 생성 될 때 라이프 사이클을 시작합니다.

    scoped-proxy=target-class은 빈 주위에 CGLIB 래퍼를 만듭니다. 그래서 다른 빈은이 래퍼에 대한 참조만을 보유하고 올바른 범위를 가진 올바른 빈은이 래퍼에 동적으로 주입된다.

    즉, 만기 된 request scoped 빈을 사용자의 session scoped 빈에 보관하지 않습니다. 이는 세션 생성 당시 주입되었을 가능성이 큽니다. 대신 새로운 요청이 생성 될 때마다 현재 요청을위한 새로운 빈이 삽입된다. 이 방법을 사용하면 콩을 더 오래 사용할 수 있습니다. 즉, session scoped 빈의 request scoped 빈을 사용할 수 있습니다.

    +0

    위대한 답변은 지금 테스트하고 피드백을 주겠다. Ondrej – engma

    +0

    나는 피곤하지만 세션을 생성 한 빈에서 executor 멤버에게 인스턴스를 생성 한 후에 액세스 할 수 없다. 내가 무엇을 요청합니까 Executor Async 메서드를 호출하고 실행 후 값을 얻지 만 프로토 타입이 작동하지 않습니다 – engma

    +0

    다른'session scoped' beans에서 호출합니까? 그렇다면'session scope'가 있어야합니다. 비동기 호출을 얼마나 오래 사용할 수 있습니까? 하나의 세션? 'singletons'에서'session scoped' 빈에 접근하지 않았습니다. 세션 빈에서'싱글 톤 '에 접근하면됩니다. –

    관련 문제