Guice注入servlet

bra*_*ebg 7 java dependency-injection guice

我是Google Guice框架的新手,我有一个关于注入guice servlet和使用RequestScope的问题.好吧,让我从我的代码中给出一些例子,只是为了清楚地说明问题.

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

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

    // constructor which is @inject 

    // getters and setters
}
Run Code Online (Sandbox Code Playgroud)

在这里,我有一个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
Run Code Online (Sandbox Code Playgroud)

这里有趣的是,我们知道servlet范围是单例.而且我怎样才能从http请求中获取 - Bean实例?因为据我所知,在注入Bean类的实例后,它会进入http请求,对吧?

欢迎任何帮助或示例.谢谢Br

Col*_*inD 16

你创建和使用Injector 内部doGet上你的servlet方法......它有没有机会了解范围或当前请求或什么的!

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

一旦你完成了,你就可以@Inject进入你的东西MainServlet(甚至使用带@Inject注释的构造函数).要获取Beanservlet内部的请求范围实例,您需要注入一个Provider<Bean>(因为Bean它的范围小于单例servlet).在请求中,您可以调用beanProvider.get()以获取Bean当前请求.

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