将 Guice 与 Java Spark 一起使用非常容易。基本上,您需要以SparkFilter
以下方式扩展以创建 Guice 注入器。
public class SparkGuiceFilter extends SparkFilter {
private Injector injector = null;
@Override
protected SparkApplication[] getApplications(final FilterConfig filterConfig) throws ServletException {
final SparkApplication[] applications = super.getApplications(filterConfig);
if (this.injector == null) {
this.injector = Guice.createInjector(new MainModule());
}
if (applications != null && applications.length != 0) {
for (SparkApplication application : applications) {
this.injector.injectMembers(application);
}
}
return applications;
}
}
然后,您需要并且必须使用 Jetty 或任何其他 servlet 容器web.xml
将 Spark 应用程序作为普通应用程序运行:war
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<filter>
<filter-name>SparkGuiceFilter</filter-name>
<filter-class>com.devng.spark.guice.SparkGuiceFilter</filter-class>
<init-param>
<param-name>applicationClass</param-name>
<param-value>com.devng.spark.SparkApp</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>SparkGuiceFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
但是,这种方法存在一些限制。您不能在 Guice 中使用基于请求的范围或会话范围。如果你不需要这个,那么你很高兴,否则你需要集成 Guice Servlet Extensions 并按照官方 Guice 文档中的GuiceFilter
描述web.xml
添加。您还需要确保在 中使用相同的注入器实例,并且您需要按照此处所述在您的中定义 a 。GuiceFilter
SparkGuiceFilter
GuiceServletContextListener
web.xml
您可以在我的 GitHub 中找到一个完整的工作示例https://github.com/devng/demo/tree/master/sparkjava-guice