An
AbstractModule是Guice引导(配置)阶段的基本构建块。您始终需要其中一个或多个。另一方面,a
ServletModule是一种特殊化,它鉴于您正在servlet容器中运行而为您做一些配置。
从Guice文档中:
该模块设置了请求和会话作用域,并提供了一个从中配置过滤器和servlet的地方。
关于Guice-Jersey集成,您当然需要进行设置。它不会突然出现。Guice和任何其他依赖项注入框架一样,在 可以控制构建对象的情况下
起作用。如有疑问,请问自己是谁创建的对象。
使用Jersey和一般的JAX-RS,谁来创建对象?不是您,您只需定义它们即可。容器创建它们。JAX-
RS运行时。在您的情况下,Jersey运行时。并且Jersey在内部使用HK2依赖项注入框架。因此,您需要 桥接
这两个框架,以便注入使用一些Guice资源定义的JAX-
RS类。或反过来!这就是为什么要有HK2滑鼠桥的原因。因此,Jersey将使用HK2来构建您的对象,而HK2也会通过该桥在Guice上查找您的资源。
一个简单的例子。我使用此代码初始化要在其中注入Guice资源的REST API。
@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注册,因为它从中拉出Guice注射器
ServletContext。或者,您可以仅将注射器添加
ServletContext到其他位置。或仅在初始化REST
API时创建注入器,这取决于您的首选项和应用程序。



