Guice 注入在 ServletContextListener 中不起作用
Guice injection doesn't work in ServletContextListener
这是 Guice 注入在 ServletConextListener 中不起作用的原因吗?
这是我的代码:
public class QuartzContextListener implements ServletContextListener {
@Inject
private DataAccess dataAccess;
@Override
public void contextInitialized(ServletContextEvent arg0) {
System.out.println(dataAccess);
}
@Override
public void contextDestroyed(ServletContextEvent arg0) {
}
当然是:
- 在应用程序注入的所有其他地方工作正常。
- 上述侦听器在 Guice 初始化后出现。
有什么想法吗?
如何扩展 GuiceServletContextListener:
class Example extends GuiceServletContextListener {
@Override
protected Injector getInjector() {
return Guice.createInjector(new MyGuiceModule(), new MyGuiceServletModule());
}
}
它不会工作,因为 Guice 没有创建您的 QuartzContextListener
的实例。如果您使用 GuiceServletContextListener
我建议只使用一个监听器(Guice 的监听器)并从那个监听器调用您的监听器。
如果该解决方案不可行,您可以尝试使用 static injection 的解决方法。小心,因为你说 Guice 在你的听众面前被引导,但情况可能并非总是如此。
要使用静态注入,您可以像这样更改侦听器定义:
public class QuartzContextListener implements ServletContextListener {
@Inject
private static Provider<DataAccess> dataAccessProvider;
...
}
然后,从您的 Guice 模块之一请求静态注入。
requestStaticInjection(QuartzContextListener.class)
这是 Guice 注入在 ServletConextListener 中不起作用的原因吗?
这是我的代码:
public class QuartzContextListener implements ServletContextListener {
@Inject
private DataAccess dataAccess;
@Override
public void contextInitialized(ServletContextEvent arg0) {
System.out.println(dataAccess);
}
@Override
public void contextDestroyed(ServletContextEvent arg0) {
}
当然是:
- 在应用程序注入的所有其他地方工作正常。
- 上述侦听器在 Guice 初始化后出现。
有什么想法吗?
如何扩展 GuiceServletContextListener:
class Example extends GuiceServletContextListener {
@Override
protected Injector getInjector() {
return Guice.createInjector(new MyGuiceModule(), new MyGuiceServletModule());
}
}
它不会工作,因为 Guice 没有创建您的 QuartzContextListener
的实例。如果您使用 GuiceServletContextListener
我建议只使用一个监听器(Guice 的监听器)并从那个监听器调用您的监听器。
如果该解决方案不可行,您可以尝试使用 static injection 的解决方法。小心,因为你说 Guice 在你的听众面前被引导,但情况可能并非总是如此。
要使用静态注入,您可以像这样更改侦听器定义:
public class QuartzContextListener implements ServletContextListener {
@Inject
private static Provider<DataAccess> dataAccessProvider;
...
}
然后,从您的 Guice 模块之一请求静态注入。
requestStaticInjection(QuartzContextListener.class)