如何使用Dagger将对象注入Servlet?
由于servlet容器实例化Servlet本身,因此不会使用Dagger创建它们。因此,我可以看到注入其中的唯一机制是通过静态注射,匕首主页警告不要这样做。还有其他(最佳实践)方法吗?
具体来说,我使用的是Jetty和GWT(我的servlet扩展了RemoteServiceServlet),但我不认为这些细节很重要。
答案 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,这可能不适合您。