Jersey和Google Guice的整合

aza*_*lut 1 java integration dependency-injection jersey guice

我的问题是:在创建部署在某种servlet容器(如jetty或tomcat)上的应用程序时,为什么在执行JavaSE应用程序和ServletModule时需要创建AbstractModule?它们之间有什么区别?

我需要将Jersey与Guice整合在一起.是否有必要为泽西岛注册Guice的存在以某种方式使用它?我不能只是启用注射并在我想要的任何地方(普通类,过滤器,处理程序,服务,DAO等)执行它们吗?为什么我不能像在JavaSE应用程序中那样配置guice,而是需要使用ServletModule?

据我在网上看到,有很多使用Guice的HK2服务的例子,反之亦然,所以我认为它很重要?(必要?)

谢谢

sar*_*gue 5

An AbstractModule是Guice的bootstrap(配置)阶段的基本构建块.你总是需要一个或多个.另一方面,a ServletModule是一个特殊化,它为你做了一些配置,因为它在servlet容器中运行.

来自Guice文档:

此模块设置请求和会话范围,并提供从中配置过滤器和servlet的位置.

关于Guice-Jersey集成,您当然需要进行设置.它不会突然发挥作用.Guice和任何其他依赖注入框架一样,在它可以控制构建对象时起作用.如有疑问,请问自己是谁创造了这个对象.

使用Jersey和JAX-RS,谁创建了对象?不是你,你只是定义它们.容器创建它们.JAX-RS运行时.在您的情况下,Jersey运行时.而泽西在内部使用HK2依赖注入框架.所以你需要桥接这两个框架,以便注入你用一些Guice资源定义的JAX-RS类.或者相反!这就是为什么有一个HK2-guice桥的原因.因此,Jersey将使用HK2构建您的对象,而HK2也会在Guice上查找您的资源.

一个简单的例子.我使用此代码初始化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);
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,上面的示例需要ServletModule注册,因为它从中拉出Guice注入器ServletContext.或者您可以将注射器添加ServletContext到其他位置.或者只是在初始化REST API时创建注入器,它取决于您的首选项和应用程序.