我有以下课程:

package com.crawler.c_api.rest;

import com.crawler.c_api.provider.ResponseCorsFilter;
import java.util.logging.Logger;

import org.glassfish.jersey.filter.LoggingFilter;
import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.server.ServerProperties;

public class ApplicationResource extends ResourceConfig {

    private static final Logger LOGGER = null;

    public ServiceXYZ pipeline;

    public ApplicationResource() {
        System.out.println("iansdiansdasdasds");
        // Register resources and providers using package-scanning.
        packages("com.crawler.c_api");

        // Register my custom provider - not needed if it's in my.package.
        register(ResponseCorsFilter.class);

        pipeline=new ServiceXYZ();

        //Register stanford
        /*Properties props = new Properties();
        props.setProperty("annotators", "tokenize, ssplit, pos, lemma, ner, parse, dcoref");
        pipeline = new StanfordCoreNLP(props);*/

        // Register an instance of LoggingFilter.
        register(new LoggingFilter(LOGGER, true));

        // Enable Tracing support.
        property(ServerProperties.TRACING, "ALL");
    }
}


我想使变量管道在整个应用程序中持久存在,这样我就可以初始化服务一次,并在其他所有类中使用它。

我怎样才能做到这一点?

最佳答案

看看Custom Injection and Lifecycle Management。它将为您提供一些如何使用Jersey进行依赖项注入的想法。例如,您首先需要将服务绑定到注入框架

public ApplicationResource() {
    ...
    register(new AbstractBinder(){
        @Override
        public void configure() {
            bind(pipeline).to(ServiceXYZ.class);
        }
    });
}


然后,您可以将ServiceXYZ注入到您的任何资源类或提供程序中(例如过滤器)。

@Path("..")
public class Resource {
    @Inject
    ServiceXYZ pipeline;

    @GET
    public Response get() {
        pipeline.doSomething();
    }
}


上面的配置将单个(单个)实例绑定到框架。

额外:-)不是针对您的用例,而是说您想要为每个请求创建一个新的服务实例。然后,您需要将其放入请求范围。

bind(ServiceXYZ.class).to(ServiceXYZ.class).in(RequestScoped.class);


注意bind中的差异。第一个使用实例,而第二个使用类。无法在请求范围内以这种方式绑定实例,因此,如果需要特殊的初始化,则需要使用Factory。您可以在我上面提供的链接中看到一个示例

10-05 18:49