Erstellen einer benutzerdefinierten @Inject-Annotation

8

Ich benutze lombok in meinem Projekt, mit vielen Klassen mit @RequiredArgsConstructors . Ich möchte, dass diese Konstruktoren automatisch in guice verwendet werden.

Eine Option, die funktioniert, ist @RequiredArgsConstructors(onConstructor=@__(@Inject)) zu verwenden, aber das ist sowohl hässlich als auch experimentell (lies: wahrscheinlich wird es in Zukunft von lombok verschwinden).

Was ich mir vorgenommen habe, ist, eine benutzerdefinierte Einfügeanmerkung zu erstellen. Sagen Sie @InjectOnlyConstructor , um meine Klassendefinition zu übernehmen, und verwenden Sie Guice SPI , um diese Typen zu binden. Aber ich kann nicht herausfinden, wie man diese Typen im SPI entdeckt.

Wie kann ich die Elemente von guice durchsehen und an diese Konstruktoren binden, die guice standardmäßig ablehnen würde?

Beispiel für eine Klasse, wie sie aussehen soll:

%Vor%

Als Backup-Plan kann ich ein Modul haben, das die Pakete meines Projekts scannt und diese Typen automatisch bindet.

    
Michael Deardeuff 01.10.2015, 18:42
quelle

1 Antwort

2

Ich fange an zu denken, dass es unmöglich ist, in Guice einzuhaken, um ungebundene Typen aufzulösen.

Also habe ich vier verschiedene Lösungen gefunden. Der erste ist mein Favorit, er umfasst das scheinbar explizite Verdrahtungsmuster, das die offiziellen Guice-Erweiterungen verwenden. Sie verwenden es wie folgt:

%Vor%

OnlyConstructorBuilder ist wie folgt definiert:

%Vor%

Der zweite Ansatz besteht darin, den Klassenpfad - oder Teile davon - nach einer bestimmten Annotation zu durchsuchen. Das war meine ursprüngliche Idee und es ist nicht schwer, wenn du Guavas Reflektionshelfer benutzt. Ich habe schon einmal etwas Ähnliches gemacht, aber die Leute finden es zu magisch. Der Bindungsbereich ist ähnlich wie oben.

Der dritte Ansatz besteht darin, bind(Bar.class) in einem Modul zu verwenden und den Elements SPI zu verwenden, um die UntargetedBinding s mit einer bestimmten Annotation aufzufinden. Aber da ich die Klasse bereits binde, könnte ich genauso gut an den einzigen Konstruktor binden.

Der vierte Ansatz ist nur das Schlimmste. Es verwendet die Elements-API und bestimmt die Abhängigkeiten jeder Bindung. Suche nach ungebundenen Abhängigkeiten mit einer bestimmten Annotation. Dies ist eine Straße, die ich nicht hinuntergehen möchte.

    
Michael Deardeuff 07.10.2015, 05:54
quelle

Tags und Links