【问题标题】:How do I inject into a Servlet with Dagger?如何使用 Dagger 注入 Servlet?
【发布时间】:2013-04-22 16:52:57
【问题描述】:

如何使用 Dagger 将对象注入 Servlet?

由于 servlet 容器自己实例化了 Servlet,它们不是用 Dagger 创建的。因此,我能看到注入它们的唯一机制是通过静态注入,匕首主页警告不要这样做。是否有其他(最佳实践)方法可以做到这一点?

具体来说,我使用的是 Jetty 和 GWT(我的 servlet 扩展了 RemoteServiceServlet),但我认为这些细节并不重要。

【问题讨论】:

    标签: gwt servlets dependency-injection dagger


    【解决方案1】:

    (还)没有任何库存基础设施代码来支持 Dagger 的 Java EE servlet 堆栈。

    也就是说,在我们完成之前,您可以通过多种方式自制。如果您仅将它用于单例,那么您可以镜像某些人在 android 上所做的事情,并在应用启动时使用上下文侦听器初始化您的图形,然后使用 Servlet 的 init() 方法进行自我注入

    当您尝试为请求添加范围时会变得更加棘手 - 并非不可能,但它需要更多的脚手架。

    【讨论】:

    • “带上下文监听器”是什么意思?您的意思是通过静态变量将 ObjectGraph 传递给 servlet,然后对其调用 get 或 inject ?
    • 不,从 ServletContextListener 中将其设置为 servlet 上下文的属性,以便您可以从 servlet 的 init 中检索它。
    • 我讨厌类加载器!这样做,我得到一个 ClassCastException,如: java.lang.ClassCastException: ca.nanometrics.apollo.server.MissionControlApolloServer cannot be cast to ca.nanometrics.apollo.server.MissionControlApolloServer (即,不能将相同类型的对象转换为相同类型——servlet 中的类加载问题!我正在使用 Jetty,并使用 WebAppContext 自己启动它。有解决方法吗?
    • 我正在进行一项更改,该更改将导致从加载其模块的同一加载器加载一个类。这可能无法解决您的问题,但它可能是更好的行为。 ://
    • 你可以告诉码头反转它的类加载器顺序,或者你可以将你的罐子移动到容器本身。出于某种原因,JDNI 示例总是只保留运行时库中的对象——这有什么好玩的。
    【解决方案2】:

    虽然没有库存基础设施,但我做了以下操作:

    我将ObjectGraph 放入了Web 服务器的ServletContext。然后,对于每个 Servlet,我可以执行以下操作,

    @Inject
    SomeDependency dependency;
    @Inject
    SomeOtherDependency otherDependency;
    
    @Override
    public void init(FilterConfig filterConfig) throws ServletException
    {
      ((ObjectGraph) filterConfig.getServletContext().getAttribute(DaggerConstants.DAGGER_OBJECT_GRAPH)).inject(this);
    }
    

    我之前自己定义了DaggerConstants。

    可能有多种方法可以将ObjectGraph 转换为ServletContext,具体取决于您的应用程序是什么。我们使用嵌入式码头服务器,因此我们在启动期间控制一切。不确定如何在一般容器中执行此操作,但假设您通过一些 init servlet 实例化您的主 ObjecGraph,您会在那里执行此操作。

    servletContext.setAttribute(DaggerConstants.DAGGER_OBJECT_GRAPH, objectGraph);
    

    请注意,我们的应用程序对整个应用程序使用单个 ObjectGraph,这可能不是您的情况。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-17
    • 2014-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-06
    • 1970-01-01
    相关资源
    最近更新 更多