如何使用 Dagger 将对象注入 Servlet?
由于 servlet 容器自己实例化了 Servlet,因此它们不是用 Dagger 创建的。因此,我能看到注入它们的唯一机制是通过静态注入,匕首主页警告不要这样做。还有另一种(最佳实践)方法吗?
具体来说,我使用的是 Jetty 和 GWT(我的 servlet 扩展了 RemoteServiceServlet),但我认为这些细节并不重要。
如何使用 Dagger 将对象注入 Servlet?
由于 servlet 容器自己实例化了 Servlet,因此它们不是用 Dagger 创建的。因此,我能看到注入它们的唯一机制是通过静态注入,匕首主页警告不要这样做。还有另一种(最佳实践)方法吗?
具体来说,我使用的是 Jetty 和 GWT(我的 servlet 扩展了 RemoteServiceServlet),但我认为这些细节并不重要。
(还)没有任何库存基础设施代码来支持 Dagger 的 Java EE servlet 堆栈。
也就是说,在我们完成之前,您可以通过多种方式自制。如果您仅将它用于单例,那么您可以镜像某些人在 android 上所做的事情,并在应用程序启动时使用上下文侦听器初始化您的图形,然后使用 Servlet 的 init() 方法进行自我注入
当您尝试为请求添加范围时,它会变得更加棘手 - 并非不可能,但它需要更多的脚手架。
虽然没有库存基础设施,但我做了以下事情:
我把它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,这可能不是您的情况。