我有一個應用程序可以運行爲一個胖罐子或一個容器作爲一個戰爭。我正在使用一個Guice模塊,該模塊在脂肪罐側延伸AbstractModule
,並且在戰爭側延伸ServletModule
。在Guice AbstractModule和Servlet模塊之間共享綁定
由於所有的綁定都是相同的,我不想在ServletModule
中重複自己。有沒有一種體面的方式來分享它們之間的代碼?
我有一個應用程序可以運行爲一個胖罐子或一個容器作爲一個戰爭。我正在使用一個Guice模塊,該模塊在脂肪罐側延伸AbstractModule
,並且在戰爭側延伸ServletModule
。在Guice AbstractModule和Servlet模塊之間共享綁定
由於所有的綁定都是相同的,我不想在ServletModule
中重複自己。有沒有一種體面的方式來分享它們之間的代碼?
還有另一種解決方案:
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);
}
}
);
}
}
這樣,你可以創建一個使用其他模塊一個模塊。有時候這更具可讀性。
事實證明,該解決方案相當簡單:
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。
我喜歡那樣;它比我的更明確。 –
@Vladimir一個嚴重的疑問 - 使用ServletModule時,是否必須在getInjector中安裝其他模塊?我希望我的請求在其他模塊中配置的單例中進行有限範圍的注入。 – LazyTechie
@LazyTechie,對不起,但我不明白你的問題。注入器使用的所有模塊必須傳遞給它的工廠方法或使用'install()'加載。因此,您只需將範圍注入和單例放入另一個模塊中,並在此處使用'install()'。 –