benutzerdefinierte Guice Binding Annotationen mit Parametern

8

Ich habe erfolgreich eine Guice-Bindungsannotation erstellt, um single-threaded java.util.concurrent.ExecutorService-Instanzen in einen Konstruktor zu injizieren.

Hier ist eine Beispielverwendung:

%Vor%

Ich möchte jetzt eine ähnliche Annotation für Multithread-Executoren erstellen, die die ThreadPool-Größe in der Annotation angibt. Zum Beispiel:

%Vor%

Weiß jemand da draußen, wie ich auf den Wert des Parameters "poolSize" von einem Guice Provider zugreifen kann?

    
murungu 18.04.2011, 15:05
quelle

4 Antworten

7

Sie können nicht. Das ist nicht so, wie verbindliche Annotationen verwendet werden sollen ... der Parameter würde nur dazu dienen, eine ExecutorService Grenze mit @MultiThreaded(poolSize = 5) von einer Grenze mit @MultiThreaded(poolSize = 2) zu differenzieren. Es sind keine Metadaten, die bei der Konfiguration von Provider helfen.

Wenn Sie etwas mit @MultiThreaded(poolSize = 5) annotieren, müssen Sie etwas mit der Anmerkung @MultiThreaded(poolSize = 5) verknüpfen. Wenn Sie dann die Poolgröße an all diesen Stellen ändern möchten, müssen Sie poolSize = 5 in poolSize = 4 sowohl an den Stellen, an denen Sie es binden, als auch an allen Stellen, an denen Sie es injizieren, ändern. Das ergibt für mich keinen Sinn.

Anstatt ExecutorService s zu binden, indem Sie angeben, wie viele Threads in ihrem Thread-Pool enthalten sind, sollten Sie sie entsprechend dem Zweck binden, für den Sie sie verwenden möchten. Dann können Sie die Anzahl der Threads anpassen, die jeweils an einer Stelle verwendet werden.

    
ColinD 18.04.2011 15:12
quelle
2

Sehen Sie sich NamedImpl an, das @Named und die Methode Names.named() implementiert. Ich denke, Sie sollten dieselbe Implementierung haben.

AKTUALISIERT Guice  vergleicht Annotationen mit hashCode (). Also, wenn Sie @MultiThreaded(poolSize = 5) nicht verwenden, sollten Sie es vor dem Instancieren zuordnen. Es scheint eine dreckige Problemumgehung zu sein, aber du kannst smt wie

schreiben %Vor%

Wenn Sie dies tun möchten. Denken Sie daran, dass Ihr MultiThreadedImpl korrekt hashCode überschreiben sollte. Es könnte smt sein wie

%Vor%     
Stas Kurilin 18.04.2011 15:08
quelle
2

Sie können so etwas mit Guice machen (ich habe es fast genau so gemacht), aber Guice muss wirklich wissen, was es bindet. Sie müssten also etwas tun wie:

%Vor%

(oder wahrscheinlicher, binden Sie an einen Provider, der es langsam initialisiert).

Das ist hässlich genug, dass Sie es wahrscheinlich nicht wirklich wollen. Es ist nützlicher, einfach nur @Named zu verwenden und eine Handvoll ExecutorService-Instanzen zu haben, die an einen bestimmten Namen gebunden sind - dann können Sie konfigurieren, wie viele Threads an einem Ort verwendet werden, anstatt sich fragen zu müssen "benutzt jemand einen ExecutorService mit 73 Threads?"

    
Tim Boudreau 14.08.2012 19:00
quelle
1

Ja, Sie können. ohne Iterator alle Situationen.

Eigentlich habe ich fast das gleiche Problem wie du. Hier ist meine Antwort und meine Frage mit meinem ganzen Code. Ich weiß nur, wie man mit Feld nicht Parameter macht, aber ich denke, das ist kein großes Problem, oder?

Folgen Sie CustomInjections im Wiki, Sie werden es wissen.

    
wener 12.06.2014 06:02
quelle