Guice注入servlet

时间:2011-05-25 07:49:45

标签: 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
}

这里我有一个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 个答案:

答案 0 :(得分:16)

您正在servlet中创建并使用Injector doGet方法...它没有机会了解范围或当前请求或任何东西!

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

完成后,您可以@InjectMainServlet内容放入@Inject(即使使用Bean带注释的构造函数)。要在servlet中获取Provider<Bean>的请求范围实例,您需要注入Bean(因为beanProvider.get()的范围小于单例servlet)。在请求中,您可以致电Bean获取当前请求的{{1}}。

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