2012-07-17 3 views
0

우리는 부두/저지 응용 프로그램을 가지고 있습니다. Guice를 사용하여 DI로 변환합니다. 문제 : Singleton 클래스의 인스턴스가 두 개 이상 필요합니다. catch : 인스턴스의 수는 구성 파일에서 동적으로 결정됩니다. 따라서 다른 인스턴스에 대해 주석을 사용할 수 없습니다.Guice 인젝터에서 하나 이상의 싱글 톤 인스턴스

final InjectedClass instance = injector.getInstance(InjectedClass.class); 

이것은 인젝터의 표준 구문입니다. 나는 거기에 Guice Key.class에서

final InjectedClass instance = injector.getInstance(Key.get(InjectedClass.class, <Annotation>); 

을 인스턴스를 얻을 수있는 방법이 있지만 문제는 좀 역동적 인 주석을 미리 정의하지가 필요하다는 것입니다

final String key = getKey(); 
final InjectedClass instance = injector.getInstance(InjectedClass.class, key); 

뭔가를해야합니다.

답변

2

이미 생성 된 모든 인스턴스의 맵을 가진 Provider 또는 @Provides 메서드를 사용해 볼 수 있습니다. 구성 파일에서 인스턴스 수가 number에 도달하면 새 인스턴스를 만들지 않고 대신 맵에서 이전 인스턴스를 반환합니다.

예를 들어 다음과 같이하면 도움이 될 수 있습니다.

public class MyObjectProvider implements Provider<MyObject> { 
    private final Injector inj; 
    private int counter; 
    private final int maxNum = 5; 
    private List<MyObject> myObjPool = new ArrayList<MyObject>(); 

    @Inject 
    public MyObjectProvider(Injector inj) { 
    this.connection = connection; 
    } 

    public MyObject get() { 
    counter = counter+1%maxNum; 
    if(myObjPool.size()=<maxNum) { 
     MyObject myobj = inj.getInstance(MyObject.class); 
     myObjPool.add(myobj); 
     return myobj; 
    } else { 
     return myObjPool.get(counter); 
    } 
    } 
} 

P. 나는 머리에서 이것을 썼다. 그래서 컴파일하지 않았을 것이다. 이것은 단지 생각 일 뿐이다.

+0

감사합니다. 솔루션이 아닌 InstancePool을 제안하고 있습니다. 인스턴스의 맵이 필요합니다. 인스턴스간에 차이가 있기 때문에 특정 인스턴스를 주입해야 할 때마다 무작위가 아닌 특정 인스턴스가 필요합니다. 어쨌든, 답변 주셔서 감사합니다. – fiction

+0

@fiction :이 요구 사항이 포함되도록 질문을 편집하십시오. – eiden

2

이 문제는 공장을 만들면 해결할 수 있습니다. 내 예에서는 guice 확장자 인 multibindings을 사용했습니다.

interface InjectedClassFactory { 
    public InjectedClass get(String key); 
} 

class InjectedClass {} 

class InjectedClassFactoryImpl implements InjectedClassFactory{ 
    private final Map<String, InjectedClass> instances; 

    @Inject 
    InjectedClassFactoryImpl(Map<String, InjectedClass> instances) { 
     this.instances = instances; 
    } 

    @Override 
    public InjectedClass get(String key) { 
     return instances.get(key); 
    } 
} 

class MyModule extends AbstractModule { 

    @Override 
    protected void configure() { 
     MapBinder<String, InjectedClass> mapBinder = 
       MapBinder.newMapBinder(binder(), String.class, InjectedClass.class); 

     //read you config file and retrieve the keys 
     mapBinder.addBinding("key1").to(InjectedClass.class).in(Singleton.class); 
     mapBinder.addBinding("key2").to(InjectedClass.class).in(Singleton.class); 
    } 
}