Внедрение зависимостей в ServletContextListener с Guice

Поскольку ServletContextListener создается сервером, а не Guice, я не могу найти способ заставить его работать вместе. Как мне получить инжектор Guice в ServletContextListener?

Может быть, есть лучший способ закрыть службы, такие как logger или persistance, чем делать это с помощью метода contextDestroyed и инициализировать их с помощью contextInitialized?

2 ответа

Решение

Расширение GuiceServlet помещает инжектор в контекст сервлета, так что вы можете получить его, выполнив что-то вроде этого:

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-Container нет основного метода, вы должны передать свой модуль сервлет-контейнеру. Таким образом, guice может управлять вашими обычными модулями Injection в контейнере сервлета.

Другие вопросы по тегам