2016-08-02 27 views
1

Grundsätzlich ist mein Problem, dass ich die Manager-Instanz benötigt, um die ServiceInterceptor-Instanz zu erstellen, und ich brauche ServiceInterceptor im BindInterceptor. Ich bin sehr neu zu Guice, also fühle ich mich wie das ist etwas einfaches, dass ich nicht in der Lage bin, einen Workaround für ...Kann man mit Guice ein Objekt erhalten, das in einem Modul gebunden ist?

Antwort

0

zu finden, das kann gelöst werden, indem man Einspritzung für Ihre Objektinstanz anfordert. Betrachten Sie dieses Beispiel schrieb ich oben:

public class TestModule2 extends AbstractModule { 

    @Override 
    protected void configure() { 
     bind(Helper.class).in(Singleton.class); 
     bind(Manager.class).to(ManagerImpl.class).in(Singleton.class); 

     MyInterceptor i = new MyInterceptor(); 
     requestInjection(i); // intercept the thing 

     bindInterceptor(Matchers.any(), Matchers.any(), i); 
    } 

    public static interface Manager { 
     public void talk(); 
    } 

    public static class ManagerImpl implements Manager { 

     @Inject 
     public ManagerImpl(Helper h) { 
     } 

     @Override 
     public void talk() { 
      System.out.println("talking"); 
     } 
    } 

    public static class Helper { 

    } 

    public static class MyInterceptor implements MethodInterceptor { 

     @Inject 
     private Manager m; 

     public MyInterceptor() { 
     } 

     @Override 
     public Object invoke(MethodInvocation invocation) throws Throwable { 
      System.out.println("intercept and manager " + m.getClass().getName()); 
      return invocation.proceed(); 
     } 
    } 

    public static void main(String[] args) { 
     Injector createInjector = Guice.createInjector(new TestModule2()); 
     Manager instance = createInjector.getInstance(Manager.class); 
     instance.talk(); 
    } 
} 

zu erklären:

  1. ich alle meine Instanzen zuerst die normale Art und Weise binden. Dies wird Helper und Manager sein. Manager kann mit Helfer und so weiter injiziert werden. Vergiss die inject-Annotationen nicht.

  2. Ich erstelle meine Interzeptor-Methode. Jetzt brauche ich das injiziert werden. Guice hat eine Methode für das Szenario:

    MyInterceptor i = new MyInterceptor(); 
    requestInjection(i); // inject the thing 
    

Dies jetzt die Manager-Instanz in Ihrem Interceptor setzt.

Und schließlich, wenn ich den obigen Code ausführen, erhalte ich:

intercept and manager test.guice.TestModule2$ManagerImpl$$EnhancerByGuice$$e5e270bc 
talking 

Beachten Sie, dass die Abfangjäger seine Nachricht gedruckt wird, dann wird der Methodenaufruf ausgeführt.

Ich hoffe, das hilft,

Artur