Gwt 如何使用Dagger注入Servlet?

Gwt 如何使用Dagger注入Servlet?,gwt,servlets,dependency-injection,dagger,Gwt,Servlets,Dependency Injection,Dagger,如何使用Dagger将对象注入Servlet 因为servlet容器实例化servlet本身,所以它们不是用Dagger创建的。因此,我能看到的唯一注入机制是通过静态注入,dagger主页警告不要这样做。还有其他(最佳实践)方法吗 具体来说,我使用的是Jetty和GWT(我的servlet扩展了RemoteServiceServlet),但我认为这些细节并不重要。目前还没有任何支持Dagger的Java EE servlet堆栈的基础架构代码 也就是说,在我们开始之前,你可以用一些方法自制它。如

如何使用Dagger将对象注入Servlet

因为servlet容器实例化servlet本身,所以它们不是用Dagger创建的。因此,我能看到的唯一注入机制是通过静态注入,dagger主页警告不要这样做。还有其他(最佳实践)方法吗

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

目前还没有任何支持Dagger的Java EE servlet堆栈的基础架构代码

也就是说,在我们开始之前,你可以用一些方法自制它。如果您只对单例使用它,那么您可以镜像一些人在android上的操作,并在应用程序启动时使用上下文侦听器初始化图形,然后使用Servlet的init()方法进行自注入


当您尝试向请求添加作用域时,它会变得更加棘手,这不是不可能的,但它需要更多的脚手架

虽然没有这方面的库存基础设施,但我做了以下工作:

我将
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
的方法可能有多种,具体取决于您的应用程序。我们使用嵌入式jetty服务器,所以在启动过程中我们控制一切。不确定如何在一般容器中实现,但假设您通过某个init servlet实例化了main
ObjecGraph
,您可以在那里实现

servletContext.setAttribute(DaggerConstants.DAGGER_OBJECT_GRAPH, objectGraph);

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

什么是“使用上下文侦听器”?你的意思是通过一个静态变量将ObjectGraph传递给servlet,然后对其调用get或inject?不,在ServletContextListener中将其设置为servlet上下文中的一个属性,以便可以从servlet的init中检索它。我讨厌类加载器!这样做,我会得到一个ClassCastException,如:java.lang.ClassCastException:ca.nanometrics.apollo.server.MissionControlApolloServer不能强制转换为ca.nanometrics.apollo.server.MissionControlApolloServer(即,无法将同一类型的对象强制转换为同一类型--servlet中的类加载问题!我正在使用Jetty,并使用WebAppContext自己启动它。是否有解决方法?我正在进行一项更改,这将导致从加载其模块的同一加载程序加载类。这可能无法解决您的问题,但这是可行的。)更好的行为,可能会更好。:/您可以告诉jetty反转其类加载器顺序,或者您可以将JAR移动到容器本身。出于某种原因,JDNI示例总是停留在运行库中的对象上-这有什么意思。好的方法,我在这里找到了一个资源,但是如何在
dagger 2