如何使用Dagger注入Servlet?

时间:2013-04-22 16:52:58

标签: gwt servlets dependency-injection dagger

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

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

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

2 个答案:

答案 0 :(得分:2)

还没有任何股票基础设施代码支持Dagger的Java EE servlet堆栈。

也就是说,有些方法可以让它自酿,直到我们达到它。如果你只是为单身人士使用它,那么你可以反映一些人在android上做的事情,并在app启动时使用上下文监听器初始化你的图形,然后使用Servlet的init()方法自我注入

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

答案 1 :(得分: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。我们使用嵌入式jetty服务器,因此我们在启动期间控制所有内容。不确定如何在一般容器中执行此操作,但假设您通过某个init servlet实例化主ObjecGraph,那么您可以在那里执行此操作。

servletContext.setAttribute(DaggerConstants.DAGGER_OBJECT_GRAPH, objectGraph);

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