Внедрение зависимостей в ServletContextListener с Guice - PullRequest
6 голосов
/ 22 декабря 2011

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

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

Ответы [ 2 ]

7 голосов
/ 28 декабря 2011

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

public class MyServletContextListener implements ServletContextListener {

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        Injector injector = (Injector) sce.getServletContext()
                                          .getAttribute(Injector.class.getName());      
    }
}
5 голосов
/ 27 апреля 2012

Вы можете легко это сделать с помощью расширения класса GuiceServletContextListener.Вот пример:

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

Здесь MyGuiceModule - это обычный GuiceModule, а ServletModule - это сервлет.В то время как в Servlet-Container нет основного метода, вы должны передать свой модуль сервлет-контейнеру.Таким образом, guice может управлять вашими обычными модулями Injection в контейнере сервлета.

...