2011-05-25 52 views
7

我是Google Guice框架中的新成员,我有一个关于在guice servlet中注入和使用RequestScope的问题。好的,让我从我的代码中举一些例子来明确事情。Guice在servlet中注入

我有例如豆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请求,对吧?

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

回答

16

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

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

一旦你这样做了,你可以@Inject东西进入你的MainServlet(即使用@Inject带注释的构造函数)。要在servlet中获得请求范围为Bean的实例,您需要注入一个Provider<Bean>(因为Bean的范围小于单例servlet)。在请求中,您可以拨打beanProvider.get()获取当前请求的Bean

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

+0

谢谢,我想我明白了。 :) – brakebg 2011-05-27 07:12:02