【问题标题】:Guice inject in servletGuice 在 servlet 中注入
【发布时间】:2011-05-25 07:49:44
【问题描述】:

我是 Google Guice 框架的新手,我有一个关于注入 guice servlet 和使用 RequestScope 的问题。好的,让我从我的代码中举一些例子来说明清楚。

我有一个 bean 类,例如 Bean ..

@RequestScope
public class Bean {
    private String user;
    private String pass;

    // constructor which is @inject 

    // getters and setters
}

这里我有一个 servlet

@Singleton
public class MainServlet extends HttpServlet {
    doGet(HttpServletRequest request, HttpServletResponse response) {
        .... some code 
        Injector injector = Guice.createInjector();
        ValidUser validUser = injector.getInstance(ValidUser.class)
        // Here i got the below exception
    }
}



com.google.inject.ConfigurationException: Guice configuration errors:

1) No scope is bound to com.google.inject.servlet.RequestScoped.
  at Bean.class while locating Bean

正如我们所知,servlet 作用域是单例的,这很有趣。 还有我如何从 http 请求中获取 - Bean 实例?因为据我所知,在注入 Bean 类的实例后,它会进入 http 请求,对吗?

欢迎任何帮助或示例。 谢谢

【问题讨论】:

    标签: java dependency-injection guice


    【解决方案1】:

    您正在 servlet 上创建和使用 Injector inside doGet 方法...它没有机会知道范围或当前请求或任何东西!

    Guice Servlet 要求您将所有请求设置为通过GuiceFilter,并创建GuiceServletContextListener 的子类,该子类会创建整个应用程序将使用的Injector。这在 Servlets 部分的 Guice 用户指南中都有描述。

    完成此操作后,您可以将 @Inject 内容放入您的 MainServlet(即使使用 @Inject 带注释的构造函数)。要在 servlet 中获取 Bean 的请求范围实例,您需要注入 Provider<Bean>(因为 Bean 的范围比单例 servlet 小)。在请求中,您可以调用beanProvider.get() 以获取当前请求的Bean

    请注意,servlet 是单例,因为这也是它们在普通 Java servlet 世界中的工作方式...它们每个都只为每个应用程序创建一次,并且单个实例用于对该 servlet 的所有请求。

    【讨论】:

    • 哇,这是一个很好的解释,但对于像我这样的新 Guice 用户来说有点困难,无论如何感谢您的提示。
    猜你喜欢
    • 2012-12-07
    • 2012-04-05
    • 2015-12-29
    • 2017-08-18
    • 2012-08-10
    • 2021-04-03
    • 1970-01-01
    • 2021-03-04
    • 1970-01-01
    相关资源
    最近更新 更多