我想在Vaadin應用程序中使用Guice(但這不應該是Vaadin特定的)。Guice和Servlet - 一般理解問題?
在我的Vaadin MyApp(擴展應用程序類)中,我可以使用@Inject註釋來注入模塊中定義的實現,並在我的自定義ContextListener中擴展GuiceServletContextListener,其中創建了Injector。
我現在想在我的應用程序中從任何地方訪問實現,但我總是得到NullPointerExceptions。
我認爲它足以創建頂級對象(這將是mycase(?)中的應用程序類)與guice,以便從該類創建的每個對象(在這種情況下與新)可以注入。
如果我使用Injector.getInstance(..)創建每個對象,它都可以工作,但是通過這種方法,我必須創建每個「中間」類,它甚至不會在此方法中使用@Inject。
我希望甚至可以用guice做什麼,或者我錯過了什麼?我的主要目的是從我的項目中的任何地方訪問DAOFactory實現(需要作爲會話作用域),而不必將它傳遞給每個構造函數。
感謝,iamgalaxys
一些代碼我使用:
ApplicationServlet:
@Singleton
public class GuiceApplicationServlet extends AbstractApplicationServlet {
private static final long serialVersionUID = -5729153715228068816L;
// Guice stuff
protected final Provider<Application> applicationProvider;
@Inject
public GuiceApplicationServlet(Provider<Application> applicationProvider) {
this.applicationProvider = applicationProvider;
}
@Override
protected Class getApplicationClass() throws ClassNotFoundException {
return Application.class;
}
@Override
protected Application getNewApplication(HttpServletRequest request) throws ServletException {
return applicationProvider.get();
}
ContextListener:
public class MyContextListener extends GuiceServletContextListener {
@Override
protected Injector getInjector() {
ServletModule module = new ServletModule() {
@Override
protected void configureServlets() {
...
serve("/*").with(GuiceApplicationServlet.class, params);
}
而且我已經定義了吉斯過濾和ContextListener在網絡.xml
是的,但注入已經在Application類中工作(嘗試使用一個常量,每當我開始一個新的用戶會話和我想在別處使用的類時都會打印它)。所以voodoo已經在那裏;)我使用GuiceFilter和擴展GuiceContextListener並使用自定義ApplicationServlet來獲取應用程序實例,使用注入提供程序;)我根本無法在任何文件中獲得我的Impls @Injected。 –
iamagalaxy
2011-06-15 19:53:13