Guice 和 Servlet - 一般理解问题?

Posted

技术标签:

【中文标题】Guice 和 Servlet - 一般理解问题?【英文标题】:Guice and Servlet - General understanding problem? 【发布时间】:2011-09-15 20:09:10 【问题描述】:

我想在 Vaadin 应用程序中使用 Guice(但这不应该是 Vaadin 特定的)。

在我的 Vaadin MyApp(扩展应用程序类)中,我可以使用 @Inject 注释将模块中定义的实现注入到我的自定义 ContextListener 扩展 GuiceServletContextListener 中,在该模块中创建注入器。

我现在想在我的应用中从 Everywhere 访问实现,但我总是得到 NullPointerExceptions。

我认为使用 guice 创建***对象(这将是 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();
    

上下文监听器:

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

【问题讨论】:

【参考方案1】:

如果您在 web.xml 中激活了必要的 voodoo,Guice 只能在 servlet 容器中工作。

您可能想阅读有关如何安装和配置 guice-servlet.jar 的文档 - http://code.google.com/p/google-guice/wiki/Servlets

【讨论】:

是的,但是 Injection 已经在 Application 类中工作了(用一个常量尝试过,每次我开始一个新的用户会话和我想在其他地方使用的类时都会打印出来)。所以巫毒已经存在;)我正在使用 GuiceFilter 和扩展的 GuiceContextListener 并使用自定义 ApplicationServlet 使用注入的 Provider 获取应用程序实例;)我根本无法在任何文件中获取我的 Impls @Injected。【参考方案2】:

“以便从这个类创建的每个对象(在本例中为 new)都可以注入”是什么意思?如果您使用newApplication 类中实例化对象,那么我认为这是您的问题。本质上,Guice 取代了new。您需要使用 Guice 实例化您的服务对象(通过注入它们,或使用 injector.getInstance()),以便 Guice 注入它们的成员或构造函数。

【讨论】:

以上是关于Guice 和 Servlet - 一般理解问题?的主要内容,如果未能解决你的问题,请参考以下文章

Servlet 3.0 注释与 Guice 结合使用

使用 Google Guice Servlet 配置 Apache Shiro

第三方小服务程序的 Guice Singleton Servlet Binding 解决方法

使用 Guice 实现 Restlet

Google Guice之作用域

App Engine 上未调用 Servlet 过滤器