我想在Vaadin应用程序中使用Guice(但这不应该是Vaadin特定的。)
在我的Vaadin MyApp(扩展应用程序类)中,我可以使用@Inject批注在我的自定义ContextListener中注入模块中定义的实现,扩展GuiceServletContextListener,其中创建了Injector。
我现在想在我的应用程序中访问Everywhere中的实现,但我总是得到NullPointerExceptions。
我认为用posice创建Top对象(在mycase(?)中是应用程序类)就足够了,因此从这个类创建的每个对象(在这种情况下都是new)都可以注入。
如果我使用Injector.getInstance(..)创建每个对象,它都可以工作,但是使用这种方法我必须创建每个“中间”类,甚至不使用@Inject和这个方法。
我希望用guice做什么,或者我错过了什么?我的主要目的是从我的项目中的任何地方访问DAOFactory实现(需要是会话作用域),而不将其传递给每个构造函数。
谢谢,iamgalaxys
我正在使用的一些代码:
ApplicationServlet:
@Singleton
public class GuiceApplicationServlet extends AbstractApplicationServlet {
private static final long serialVersionUID = -5729153715228068816L;
// Guice stuff
protected final Provider<Application> applicationProvider;
@Inject
public GuiceApplicationServlet(Provider<Application> applicationProvider) {
this.applicationProvider = applicationProvider;
}
@Override
protected Class getApplicationClass() throws ClassNotFoundException {
return Application.class;
}
@Override
protected Application getNewApplication(HttpServletRequest request) throws ServletException {
return applicationProvider.get();
}
ContextListener:
public class MyContextListener extends GuiceServletContextListener {
@Override
protected Injector getInjector() {
ServletModule module = new ServletModule() {
@Override
protected void configureServlets() {
...
serve("/*").with(GuiceApplicationServlet.class, params);
}
我在web.xml中定义了Guice Filter和ContextListener
答案 0 :(得分:0)
如果你在web.xml中激活了必要的voodoo,Guice只能在servlet容器中工作。
您可能需要阅读有关如何安装和配置guice-servlet.jar的文档 - http://code.google.com/p/google-guice/wiki/Servlets
答案 1 :(得分:0)
你是什么意思“所以从这个类创建的每个对象(在这种情况下使用new)都可以注入”?如果您使用Application
在new
课程中实例化对象,那么我认为这是您的问题。从本质上讲,Guice取代了new
。您需要使用Guice实例化您的服务对象(通过注入它们,或使用injector.getInstance()
),以便Guice注入其成员或构造函数。