Guice在Servlet中的注入

7

我是一个对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请求中,对吗?
欢迎任何帮助或示例。
谢谢 Br
1个回答

19

您正在在servlet的doGet方法中创建和使用一个Injector,它不可能了解作用域、当前请求或其他任何信息!

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

完成后,您可以通过@Inject(甚至使用带有@Inject注释的构造函数)将内容注入到您的MainServlet中。要获取servlet内部的请求作用域实例Bean,您需要注入一个Provider<Bean>(因为Bean的作用域小于单例servlet)。在请求中,您可以调用beanProvider.get()来获取当前请求的Bean

请注意,servlet是单例的,因为在普通Java servlet世界中是这样工作的...每个servlet仅被创建一次,并且该单个实例用于该servlet的所有请求。


1
哇,这是一个很好的解释,但对于像我这样的新 Guice 用户来说有点难,不管怎样感谢你的提示。 - Stefano Bossi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接