6

由于 ServletContextListener 是由服务器创建的,而不是由 Guice 创建的,所以我找不到让它一起工作的方法。如何在 ServletContextListener 获得 guice 注入器?

也许有更好的方法来关闭记录器或持久性等服务,然后在 contextDestroyed 方法中执行它并在 contextInitialized 中初始化它们?

4

2 回答 2

7

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

public class MyServletContextListener implements ServletContextListener {

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        Injector injector = (Injector) sce.getServletContext()
                                          .getAttribute(Injector.class.getName());      
    }
}
于 2011-12-27T22:35:50.130 回答
5

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

public class MyServletConfig extends GuiceServletContextListener {
    @Override
    protected Injector getInjector() {
        return Guice.createInjector(new MyGuiceModule(), new MyGuiceServletModule());
    }
}

这里的 MyGuiceModule 是一个普通的 GuiceModule,而 ServletModule 是一个 servlet。而 Servlet-Container 中没有 main 方法,您应该将模块交给 Servlet 容器。这样,guice 可以在 servlet 容器中管理您的正常注入模块。

于 2012-04-27T14:20:23.667 回答