1

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

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

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

4

2 回答 2

2

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

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

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

于 2013-04-22T18:45:51.113 回答
1

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

我把它ObjectGraph放到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我们使用嵌入式码头服务器,因此我们在启动期间控制一切。不确定如何在通用容器中执行此操作,但假设您ObjecGraph通过一些 init servlet 实例化您的 main,您会在那里执行此操作。

servletContext.setAttribute(DaggerConstants.DAGGER_OBJECT_GRAPH, objectGraph);

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

于 2015-04-07T15:55:37.987 回答