Внедрение зависимостей в 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 в контейнере сервлета.