Jersey 和 Google Guice 集成
Jersey and Google Guice integration
我的问题是:为什么在执行 JavaSE 应用程序时需要创建 AbstractModule 而在创建部署在某种 servlet 容器(如码头或 tomcat 上)的应用程序时需要创建 ServletModule?它们之间有什么区别?
我需要将 Jersey 与 Guice 集成。是否有必要为 Jersey 注册 Guice 以某种方式使用它?我不能只启用注入并在我想要的任何地方进行注入(正常 类、过滤器、处理程序、服务、DAO 等)吗?为什么我不能像在 JavaSE 应用程序中那样配置 guice,而是需要使用 ServletModule?
据我在网上看到,有很多Guice使用HK2服务的例子,反之亦然,所以我可以认为它很重要吗? (有必要吗?)
谢谢
AbstractModule
是 Guice bootstrap(配置)阶段的基本构建块。你总是需要一个或多个。另一方面,ServletModule
是一种专门化,它为您做一些配置,因为它在 servlet 容器中是 运行。
This module sets up the request and session scopes, and provides a
place to configure your filters and servlets from.
关于 Guice-Jersey 集成,您当然需要设置它。它不会突然起作用。 Guice 与任何其他依赖项注入框架一样,在 它可以控制构建您的对象时工作 。如有疑问,请问问自己是谁创建了该对象。
对于 Jersey 和一般的 JAX-RS,谁创建对象?不是你,你只是定义它们。容器创建它们。 JAX-RS 运行时。在您的情况下,Jersey 运行时。并且 Jersey 内部使用了 HK2 依赖注入框架。因此,您需要 桥接 这两个框架,以便注入您使用一些 Guice 资源定义的 JAX-RS class。或者反过来!这就是为什么有一个HK2-guice bridge的原因。所以 Jersey 会使用 HK2 构建你的对象,HK2 也会在 Guice 上查找你的资源,这要感谢这个桥。
一个简单的例子。 I use this code 初始化 REST API 我想在其中注入 Guice 资源。
@ApplicationPath("api")
public class ApiRest extends ResourceConfig {
private static final Logger log = LoggerFactory.getLogger(ApiRest.class);
@Inject
public ApiRest(ServiceLocator serviceLocator, ServletContext servletContext) {
log.debug("Inicialitzant Jersey.");
packages("net.sargue.app.api");
GuiceBridge.getGuiceBridge().initializeGuiceBridge(serviceLocator);
GuiceIntoHK2Bridge guiceBridge = serviceLocator.getService(GuiceIntoHK2Bridge.class);
Injector injector = (Injector) servletContext.getAttribute(Injector.class.getName());
if (injector == null)
throw new RuntimeException("Guice Injector not found");
guiceBridge.bridgeGuiceInjector(injector);
}
}
请注意,上面的示例需要 ServletModule
注册,因为它从 ServletContext
中提取 Guice 注入器。或者您可以将注入器添加到其他地方的 ServletContext
。或者只是在初始化 REST 时创建注入器 API,这取决于您的偏好和应用程序。
我的问题是:为什么在执行 JavaSE 应用程序时需要创建 AbstractModule 而在创建部署在某种 servlet 容器(如码头或 tomcat 上)的应用程序时需要创建 ServletModule?它们之间有什么区别?
我需要将 Jersey 与 Guice 集成。是否有必要为 Jersey 注册 Guice 以某种方式使用它?我不能只启用注入并在我想要的任何地方进行注入(正常 类、过滤器、处理程序、服务、DAO 等)吗?为什么我不能像在 JavaSE 应用程序中那样配置 guice,而是需要使用 ServletModule?
据我在网上看到,有很多Guice使用HK2服务的例子,反之亦然,所以我可以认为它很重要吗? (有必要吗?)
谢谢
AbstractModule
是 Guice bootstrap(配置)阶段的基本构建块。你总是需要一个或多个。另一方面,ServletModule
是一种专门化,它为您做一些配置,因为它在 servlet 容器中是 运行。
This module sets up the request and session scopes, and provides a place to configure your filters and servlets from.
关于 Guice-Jersey 集成,您当然需要设置它。它不会突然起作用。 Guice 与任何其他依赖项注入框架一样,在 它可以控制构建您的对象时工作 。如有疑问,请问问自己是谁创建了该对象。
对于 Jersey 和一般的 JAX-RS,谁创建对象?不是你,你只是定义它们。容器创建它们。 JAX-RS 运行时。在您的情况下,Jersey 运行时。并且 Jersey 内部使用了 HK2 依赖注入框架。因此,您需要 桥接 这两个框架,以便注入您使用一些 Guice 资源定义的 JAX-RS class。或者反过来!这就是为什么有一个HK2-guice bridge的原因。所以 Jersey 会使用 HK2 构建你的对象,HK2 也会在 Guice 上查找你的资源,这要感谢这个桥。
一个简单的例子。 I use this code 初始化 REST API 我想在其中注入 Guice 资源。
@ApplicationPath("api")
public class ApiRest extends ResourceConfig {
private static final Logger log = LoggerFactory.getLogger(ApiRest.class);
@Inject
public ApiRest(ServiceLocator serviceLocator, ServletContext servletContext) {
log.debug("Inicialitzant Jersey.");
packages("net.sargue.app.api");
GuiceBridge.getGuiceBridge().initializeGuiceBridge(serviceLocator);
GuiceIntoHK2Bridge guiceBridge = serviceLocator.getService(GuiceIntoHK2Bridge.class);
Injector injector = (Injector) servletContext.getAttribute(Injector.class.getName());
if (injector == null)
throw new RuntimeException("Guice Injector not found");
guiceBridge.bridgeGuiceInjector(injector);
}
}
请注意,上面的示例需要 ServletModule
注册,因为它从 ServletContext
中提取 Guice 注入器。或者您可以将注入器添加到其他地方的 ServletContext
。或者只是在初始化 REST 时创建注入器 API,这取决于您的偏好和应用程序。