Servlets 使用GUI将依赖项注入ServletContextListener

Servlets 使用GUI将依赖项注入ServletContextListener,servlets,dependency-injection,guice,servlet-listeners,guice-servlet,Servlets,Dependency Injection,Guice,Servlet Listeners,Guice Servlet,因为ServletContextListener是由服务器创建的,而不是由Guice创建的,所以我找不到一种方法让它一起工作。如何在ServletContextListener获取guice injector 也许有更好的方法关闭logger或persistance等服务,然后在contextDestroyed方法中执行,并在contextInitialized中初始化它们?扩展将注入器置于servlet上下文中,因此您可以通过执行以下操作来获得注入器: public class MyServl

因为ServletContextListener是由服务器创建的,而不是由Guice创建的,所以我找不到一种方法让它一起工作。如何在ServletContextListener获取guice injector

也许有更好的方法关闭logger或persistance等服务,然后在contextDestroyed方法中执行,并在contextInitialized中初始化它们?

扩展将注入器置于servlet上下文中,因此您可以通过执行以下操作来获得注入器:

public class MyServletContextListener implements ServletContextListener {

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        Injector injector = (Injector) sce.getServletContext()
                                          .getAttribute(Injector.class.getName());      
    }
}

通过扩展GuiceServletContextListener类,您可以轻松地做到这一点。以下是一个例子:

public class MyServletConfig extends GuiceServletContextListener {
    @Override
    protected Injector getInjector() {
        return Guice.createInjector(new MyGuiceModule(), new MyGuiceServletModule());
    }
}
这里MyGuiceModule是一个普通的GuiceModule,ServletModule是一个servlet。尽管Servlet容器中没有main方法,但您应该将模块交给Servlet容器。这样guice就可以在servlet容器中管理您的普通注入模块