2013-12-20 3 views
5

Ich entwickle eine REST-API mit Jersey 2 und ich brauche einige meiner Klassen beim Start instanziiert werden und nicht nur, wenn einige Ressourcenanforderung es auslöst.Was entspricht asEagerSingleton in HK2 in Jersey 2?

Also was ich fragen ist: Wie erreiche ich, dass eine Instanz von SomethingImpl definiert hier unten beim Start des Servers erstellt wird und nicht nur, wenn jemand die Ressource etwas trifft? In Guice würde ich .asEagerSingleton() verwenden.

Anwendung:

public class MyApplication extends ResourceConfig { 
    public MyApplication() { 
     register(new AbstractBinder() { 
      @Override 
      protected void configure() { 
       bind(" else").to(String.class); 
       bind(SomethingImpl.class).to(Something.class).in(Singleton.class); 
      } 
     }); 

     register(SomeResource.class); 
    } 
} 

Etwas:

public interface Something { 
    String something(); 
} 

public class SomethingImpl implements Something { 
    @Inject 
    public SomethingImpl(final String something) { 
     new Thread(new Runnable() { 
      @Override 
      public void run() { 
       while (true) { 
        System.out.println(something() + something); 

        try { 
         Thread.sleep(4000); 

        } catch (final InterruptedException e) { 
         break; 
        } 
       } 
      } 
     }).start(); 
    } 

    @Override 
    public String something() { 
     return "Something"; 
    } 
} 

Einige Ressource:

@Path("/") 
public class SomeResource { 
    private final Something something; 

    @Inject 
    public SomeResource(final Something something) { 
     this.something = something; 
    } 

    @GET 
    @Path("something") 
    public String something() { 
     return something.something(); 
    } 
} 
+0

standardmäßig aktivieren Sie können nicht einfach erstellen und eine Instanz von 'SomethingImpl' binden, statt die Bindung Klassentyp? – Kapep

+0

In diesem vereinfachten Code, ja. Aber in meinem realen Code haben die Klassen, die ich instanziiert, Konstruktoren, die mehrere injizierte Objekte nehmen. – Stine

Antwort

5

In einer späteren Version von hk2 als mit Jersey integriert ist (die aber bald integriert wird) Sie können Services, @Immediate gekennzeichnet sind. Diese werden grundsätzlich gestartet, sobald sie zu hk2 hinzugefügt werden. Damit es jedoch funktioniert, müssen Sie dem System den Direktkontext hinzufügen (z. B. https://hk2.java.net/2.2.0-b27/apidocs/org/glassfish/hk2/utilities/ServiceLocatorUtilities.html#enableImmediateScope%28org.glassfish.hk2.api.ServiceLocator%29)

Es wäre eine gute Idee, mit dem Team von Jersey Lobby zu betreiben, um dieses Bereichs-/Kontextpaar standardmäßig aktivieren zu lassen (sie ermöglichen bereits Dinge wie PerThread scope)

ich dieses Problem geschaffen haben: https://java.net/jira/browse/JERSEY-2291 zu beantragen, dass Jersey @Immediate Dienste

+0

Klingt vielversprechend :) Aber wie rufe ich 'ServiceLocatorUtilities.enableImmediateScope', wenn es nicht von der in Jersey enthaltenen HK2 unterstützt wird? – Stine

+1

Ich glaube nicht, dass du das kannst. Sie müssen auf eine Version von Jersey mit einer ausreichend hohen Version von hk2 warten. Ich glaube, das wird sehr bald im neuen Jahr passieren, also musst du vielleicht bis dahin warten – jwells131313

+0

Dachte so;) Danke, dass du dein Wissen über '@ Immediate' weitergegeben hast. Ich werde jetzt aufgeben und nur die Objekte erstellen, die ich beim manuellen Start benötige. – Stine

0

eine Implementierung eines javax.servlet.ServletContextListener schreiben und dass Zuhörer auf Ihre Web-xml hinzufügen .

http://www.mkyong.com/servlet/what-is-listener-servletcontextlistener-example/

+0

Aber in meinem Servlet-Kontext-Listener kann ich Objekte nicht injiziert haben? – Stine

+0

Bei meiner Arbeit verwenden wir Spring mit unseren Servlet-Context-Listenern, und es bringt definitiv Abhängigkeiten in den Listener. Ich denke, es funktioniert so lange, wie der Feder-Servlet-Kontext-Listener vor dem Listener aufgelistet ist, aber ich bin mir nicht ganz sicher. Natürlich müssen Sie den Listener auch als Frühlingsbohne in Ihrem App-Kontext definieren. – msknapp

+0

Ich würde es vorziehen, nicht mehrere Abhängigkeits-Injection-Frameworks zu mischen. Vielleicht sollte ich einfach auf HK2 verzichten und stattdessen zu Guice oder Spring wechseln. Es ist nur ein bisschen nervig in diesem Stadium;) – Stine

0

Außer dem, was gesagt msknapp Sie auch @WebListener für die Servlet-Kontext-Listener verwenden können, so dass Sie den Hörer zu web.xml nicht hinzufügen. Dann wird Ihr Zuhörer aussehen

@WebListener 
public class SomethingListener implements ServletContextListener { 
    @Inject 
    private final Something something; 

    @Override 
    public void contextInitialized(ServletContextEvent sce) { 
     //put code about something here 
    } 
} 
+0

Wenn ich das mache, wird das etwas nicht injiziert? – Stine

+0

Ich benutze Spring als die Abhängigkeit Injektion Framework mit Jersey. Ich habe HK2 vorher nicht benutzt. Ich würde vorschlagen, nicht mit anderen Rahmen zu vermasseln, wenn Sie bereits Spring verwenden.Ein Beispiel für Jersey with Spring finden Sie [hier] (https://github.com/jersey/jersey/tree/2.4.1/examples/helloworld-spring-webapp). – tonga

+0

Ich benutze nicht Spring ... zumindest nicht, was mir bekannt ist: D – Stine