2011-04-18 3 views
8

Guice 바인딩 어노테이션을 생성하여 단일 스레드 java.util.concurrent.ExecutorService 인스턴스를 생성자에 주입했습니다.사용자 정의 Guice 바인딩 어노테이션 (파라미터 포함)

public class ContainsSingleThreadedExecutorService { 


    private final ExecutorService executorService; 

    @Inject 
    public ContainsSingleThreadedExecutorService(@SingleThreaded ExecutorService executorService) { 

     this.executorService = executorService; 
    } 

} 

지금 주석의 스레드 풀 크기를 지정, 다중 스레드 집행에 대한 유사한 주석을 만들려면 여기

은 사용 예입니다. 예를 들면 : 나는 Guice 제공자에서 "poolSize"매개 변수의 값에 액세스 할 수있는 방법을

public class ContainsMultiThreadedExecutorService { 


    private final ExecutorService executorService; 

    @Inject 
    public ContainsMultiThreadedExecutorService(@MultiThreaded(poolSize = 5) ExecutorService executorService) { 

     this.executorService = executorService; 
    } 

} 

사람이 거기 알고 있나요?

답변

2

@Named 및 방법 Names.named()을 구현하는 NamedImpl을 살펴보십시오. 나는 당신이 동일한 구현을해야한다고 생각합니다.

Guice 는 해시 코드에 의해 통계를 비교 UPDATED(). 따라서 @MultiThreaded(poolSize = 5)을 사용하지 않으려면 인스 턴싱 전에 매핑해야합니다. 더러운 해결 방법 인 것처럼 보이지만

for (int i = 1; i < 20; i++){ 
     bind(ExecutorService.class).annotatedWith(Qualifiers.withValue(i)).toProvider(new DependencyProvider(i)); 
    } 

과 같이 smt를 쓸 수 있습니다. MultiThreadedImplhashCode을 올바르게 덮어 쓰십시오.

@Override 
public int hashCode() { 
    return (127 * "poolSize".hashCode())^value; 
} 
+0

이것은 실제로 질문에 전혀 대답하지 않습니다. – ColinD

+0

@murungu, @ColinD updated –

7

당신은 할 수 없습니다. 바인딩 어노테이션을 사용하는 방법이 아닙니다 ... 매개 변수는 @MultiThreaded(poolSize = 5)으로 바인딩 된 ExecutorService@MultiThreaded(poolSize = 2)으로 바인딩 된 요소를 구분하는 역할을합니다. Provider을 구성하는 데 도움이되는 메타 데이터가 아닙니다.

@MultiThreaded(poolSize = 5)으로 주석이 달린 것을 삽입하는 경우, @MultiThreaded(poolSize = 5)이라는 주석으로 무엇인가를 바인딩해야합니다. 그런 다음 모든 장소에서 사용중인 풀 크기를 변경하려면 바인드하는 곳과 삽입 한 모든 장소에서 poolSize = 5poolSize = 4으로 변경해야합니다. 이것은 나에게별로 의미가 없습니다.

ExecutorService을 스레드 풀에 몇 개의 스레드로 묶는 대신에, 사용할 스레드에 따라 바인드해야합니다. 그런 다음 한 곳에서 사용하는 스레드 수를 조정할 수 있습니다.

2

Guice와 함께 이런 일을 할 수 있지만 (Guice), Guice는 실제로 그것이 바인딩되어 있는지 미리 알아야합니다. 따라서 다음과 같이해야합니다.

for (int i=1; i < 100; i++) { 
    ExecutorService svc = Executors.newFixedThreadPool(i); 
    bind (ExecutorService.class).annotatedWith(new MultiThreadedImpl(i)).toInstance(svc); 
} 

(또는 지연 가능성이 낮은 제공자에 바인딩).

이것은 실제로는 실제로 원하지 않는 정도로보기 흉합니다. @Named를 사용하고 ExecutorService 인스턴스를 소수만 가지고 있으면 어쨌든 좋은 일을 할 수있는 이름으로 묶여 있습니다. 그런 다음 궁금하지 않고 한 곳에서 사용되는 스레드 수를 구성 할 수 있습니다 "73 스레드 ExecutorService를 사용하는 사람이 있습니까?"

1

예, 가능합니다. 반복자없이 모든 상황.

사실, 나는 당신과 거의 같은 문제가 있습니다. Here 내 대답과 질문, 내 모든 코드입니다. 필자는 필드가 아닌 매개 변수를 사용하는 방법 만 알고 있지만 이것이 큰 문제는 아니라고 생각합니다.

위키의 CustomInjections을 따라하면 어떻게되는지 알 수 있습니다.

+0

안녕하세요, 저는 지금 바빠서 그래요.하지만 유익한 시간을 가질 것입니다. – murungu

관련 문제