2014-03-25 71 views
1

我有一個應用程序可以運行爲一個胖罐子或一個容器作爲一個戰爭。我正在使用一個Guice模塊,該模塊在脂肪罐側延伸AbstractModule,並且在戰爭側延伸ServletModule在Guice AbstractModule和Servlet模塊之間共享綁定

由於所有的綁定都是相同的,我不想在ServletModule中重複自己。有沒有一種體面的方式來分享它們之間的代碼?

回答

1

還有另一種解決方案:

public class MyGuiceServletConfig extends GuiceServletContextListener { 
    @Override 
    protected Injector getInjector() { 
     return Guice.createInjector(
      new ServletModule() { 
       @Override 
       protected void configureServlets() { 
        install(new MyGuiceModule()); 

        serve("*").with(Test.class); 
        bind(Test.class).in(Singleton.class); 
       } 
      } 
     ); 
    } 
} 

這樣,你可以創建一個使用其他模塊一個模塊。有時候這更具可讀性。

+0

我喜歡那樣;它比我的更明確。 –

+0

@Vladimir一個嚴重的疑問 - 使用ServletModule時,是否必須在getInjector中安裝其他模塊?我希望我的請求在其他模塊中配置的單例中進行有限範圍的注入。 – LazyTechie

+0

@LazyTechie,對不起,但我不明白你的問題。注入器使用的所有模塊必須傳遞給它的工廠方法或使用'install()'加載。因此,您只需將範圍注入和單例放入另一個模塊中,並在此處使用'install()'。 –

0

事實證明,該解決方案相當簡單:

public class MyGuiceModule extends AbstractModule { 
    @Override 
    protected void configure() { 
     bind(Foo.class).in(Singleton.class); 
    } 
} 

public class MyGuiceServletConfig extends GuiceServletContextListener { 
    @Override 
    protected Injector getInjector() { 
     return Guice.createInjector(
      new ServletModule() { 
       @Override 
       protected void configureServlets() { 
        serve("*").with(Test.class); 
        bind(Test.class).in(Singleton.class); 
       } 
      }, 
      new MyGuiceModule() 
     ); 
    } 
} 

我最後的解決得益於偶然發現這個偉大的答案:Simple Example with Guice Servlets