2013-12-20 41 views
5

我正在開發一個使用Jersey 2的REST API,我需要一些類在啓動時實例化,而不僅僅是當某些資源請求觸發它時。澤西島2中HK2的asEagerSingleton是什麼?

所以我問的是:我如何實現下面定義的SomethingImpl實例是在服務器啓動時創建的,而不僅僅是當有人點擊某些資源時?在Guice中,我會使用.asEagerSingleton()

應用:

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); 
    } 
} 

東西:

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"; 
    } 
} 

一些資源:

@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

你就不能創建和綁定SomethingImpl'的'實例,而不是綁定班級類型? – Kapep

+0

在這個簡化的代碼中,是的。但在我真正的代碼中,我需要實例化的類具有幾個注入對象的構造函數。 – Stine

回答

5

在HK2以後的版本比與新澤西集成(但將很快集成),你可以有標記@Immediate服務。這些基本上一旦添加到hk2就開始了。然而,爲了使它工作,你將不得不添加立即上下文到系統(例如https://hk2.java.net/2.2.0-b27/apidocs/org/glassfish/hk2/utilities/ServiceLocatorUtilities.html#enableImmediateScope%28org.glassfish.hk2.api.ServiceLocator%29

這是一個好主意,與澤西團隊遊說這個範圍/上下文對默認啓用(他們已經使之類的東西PerThread範圍)

我創造了這個問題:https://java.net/jira/browse/JERSEY-2291要求澤西默認情況下啓用@Immediate服務

+0

聽起來很有希望:)但是,如果Jersey中包含的HK2不支持,我怎麼調用'ServiceLocatorUtilities.enableImmediateScope'? – Stine

+1

我不認爲你可以。你必須等待足夠高版本的hk2的Jersey版本。我相信這種情況在新的一年很快就會發生,所以你可能需要等到 – jwells131313

+0

這麼想;)感謝你分享你關於'@ Immediate'的知識。我現在就放棄,只是手動啓動時創建我需要的對象。 – Stine

0

撰寫過javax.servlet.ServletContextListener的實現和監聽器添加到您的網站的XML 。

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

+0

但在我的servlet上下文偵聽器中,我不能注入對象? – Stine

+0

在我的工作中,我們使用spring和servlet上下文監聽器,並且它確實將依賴關係注入到監聽器中。我認爲它只要在你的監聽器之前列出了spring servlet上下文監聽器就行,但我並不完全確定這一點。當然,您還必須在您的應用上下文中將偵聽器定義爲spring bean。 – msknapp

+0

我不想混用幾個依賴注入框架。也許我應該放棄HK2,轉而使用Guice或Spring。在這個階段它只是有點煩人;) – Stine

0

再說什麼msknapp說,你也可以使用@WebListener的servlet上下文監聽器,這樣你就不必在監聽器添加到web.xml中。然後,你的聽衆會像

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

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

當我這樣做時,某些東西沒有被注入? – Stine

+0

我使用Spring作爲Jersey的依賴注入框架。我以前沒有使用過HK2。如果你已經在使用Spring,我建議不要搞亂其他框架。Jersey和Spring的例子可以在這裏找到(https://github.com/jersey/jersey/tree/2.4.1/examples/helloworld-spring-webapp)。 – tonga

+0

我不使用Spring ...至少不是我所知道的:D – Stine