2016-03-23 6 views
1

Im Moment, um ein Objekt vom Typ Foo in Bar zu injizieren, mache ich folgendes.Muss ich eine Fabrik verwenden, um ein einfaches Objekt in Jersey zu injizieren?

class Bar { 
    @Inject 
    Foo field; 

    public Foo getField() { return field; } 
} 

-Code Implementierung ab Werk:

Klasse werden in injiziert

public class Foo implements Factory<Foo> { 
    @Override 
    public Foo provide() { 
     return new Foo(); 
    } 

    @Override 
    public void dispose(Foo f) { 
    } 
} 

-Code in der Hauptkonfigurations:

final ResourceConfig rc = new ResourceConfig() 
       .packages("com.example") 
       .register(
         new AbstractBinder() { 
          @Override 
          protected void configure() { 
           bindFactory(new FooFactory()).to(Foo.class).in(Singleton.class); 
          } 
         }) 

Meine Frage ist ... In Jersey 2.0, die hk2 für die Abhängigkeitsinjektion verwendet, gibt es sowieso ein Objekt zu injizieren, ohne eine Factory-Klasse zu erstellen?

Antwort

1

Es ist möglich, eine AbstractBinder zur Injektionsbindung ohne Factory oder InjectionResolver zu verwenden.

register(new AbstractBinder() { 
     @Override 
     protected void configure() { 
      bind(Foo.class).to(Foo.class); 
      bind(Bar.class).to(Bar.class); 
     } 
    }); 

In diesem Fall haben die Klassen Foo und Bar leere Konstruktoren.

public class Bar { 
    @Inject 
    Foo field; 
    public Foo getField() { return field; } 
} 

public class Foo {} 

Jetzt können Sie Bar in eine Ressource oder andere hk2 Bohnen injizieren.

+0

Was wäre, wenn die Klasse einen Konstruktor mit Parametern hätte? Müssten all diese Parameter auch @Inject benötigen? – oibe

+0

nicht möglich, Sie können @Inject nur für Felder verwenden oder die Instanz auf diese Weise binden: bind (neuer Balken ("test")). To (Bar.class); –

+0

im Allgemeinen, für komplexere Injektionsanforderungen (z. B. assistierte Injektion) müssen Sie den InjectionResolver oder Factories verwenden. –