2016-04-10 13 views
1

Ich arbeite an einer vorhandenen Java-Code-Basis, die Guice für Dependency Injection verwendet. Ich habe eine neue Klasse Foo, die ein Mitglied Feld hat (bar) ich in injizieren wollte wie folgt aus:.inject Objekt ohne Zugriff auf Injektor in Guice

public class Foo { 
    @Inject 
    private Bar bar; 
} 

Allerdings gibt es zwei Dinge:

  1. Es gibt keinen direkten Zugriff auf die Injektor, wo der Foo verwendet wird.
  2. Der Client möchte "neu" verwenden, um Foo zu erstellen.

Ist es noch möglich Bar in Foo Objekt zu injizieren, wenn die Kunden tun:

myFoo = new Foo(); 

Ich bin sehr neu zu DI und Guice, nicht wirklich verstehen, wie Sie Objekte ohne Injektor Aufruf injizieren .createInstance() für seine Klasse oder seine Containerklasse. Es scheint in meinen Tests nicht zu funktionieren.

Antwort

2

Kein DI-Tool funktioniert, wenn Sie Ihre Instanzen selbst über "neu" erstellen. Das ist nicht spezifisch. Wenn Sie also Ihre Einschränkung "2" nicht fallen lassen, wird es Ihnen schwer fallen.

+0

ich denke, Sie haben Recht, nach mehr Forschung jetzt tun Ich verstehe es ein bisschen besser. – user1783732

1

Mit Guice können Sie force the injection of fields, wenn Sie einen Verweis auf den Injektor haben. Wie folgt aus:

injector.injectMembers(fooObject); 

Ihr erster Punkt sagt, Sie haben keinen Zugriff auf den Injektor, wo Foo verwendet wird. Nun, Sie können versuchen, das zu lösen, indem Sie Foo eine statische Referenz auf den Injektor geben.

public class Foo { 
    @Inject private static Injector injector; 

    @Inject 
    private Bar bar; 

    public Foo() { 
    injector.injectMembers(this); 
    } 
} 

Aber warten Sie, dass, weil das injector Feld nur null sein wird, nicht aus der Box funktionieren würde. Sie müssen es auch injizieren, aber da es ein statisches Feld ist, tun Sie es nur einmal. Es heißt static injection. Wahrscheinlich beim Start der Anwendung, wo Sie Zugriff auf den Guice-Injektor haben, in jedem der Guice-Module.

, wo man dies nur ausführen:

requestStaticInjection(Foo.class) 
+0

das sieht ziemlich magisch aus. Ich werde dies notieren. Auf der anderen Seite fühlt es sich nicht elegant für diesen Fall IMO. Jetzt habe ich versucht, den Balken an der Stelle einzufügen, an der "new Foo" aufgerufen wird und übergebe Bar als Parameter an Foo. Es scheint zu funktionieren. – user1783732