Jersey 2 使 class/object 在整个应用程序中持续存在
Jersey 2 make class/object persist throughout the app
我关注class:
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");
}
}
我想让变量管道在整个应用程序中持续存在,这样我就可以初始化一次服务并在其他所有服务中使用它class。
我该怎么做?
看看Custom Injection and Lifecycle Management。它会让您了解如何使用 Jersey 进行依赖注入。例如,首先需要将服务绑定到注入框架
public ApplicationResource() {
...
register(new AbstractBinder(){
@Override
public void configure() {
bind(pipeline).to(ServiceXYZ.class);
}
});
}
然后您可以将 ServiceXYZ
注入您的任何资源 classes 或提供者(如过滤器)。
@Path("..")
public class Resource {
@Inject
ServiceXYZ pipeline;
@GET
public Response get() {
pipeline.doSomething();
}
}
以上配置将单例(singleton)实例绑定到框架。
Extra :-) 不适用于您的用例,但例如您希望为每个请求创建一个新的服务实例。然后你需要把它放在请求范围内。
bind(ServiceXYZ.class).to(ServiceXYZ.class).in(RequestScoped.class);
请注意 bind
中的差异。第一个使用实例,而第二个使用 class。无法在请求范围内以这种方式绑定实例,因此如果需要特殊初始化,则需要使用 Factory
。你可以在我上面提供的 link
中看到一个例子
我关注class:
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");
}
}
我想让变量管道在整个应用程序中持续存在,这样我就可以初始化一次服务并在其他所有服务中使用它class。
我该怎么做?
看看Custom Injection and Lifecycle Management。它会让您了解如何使用 Jersey 进行依赖注入。例如,首先需要将服务绑定到注入框架
public ApplicationResource() {
...
register(new AbstractBinder(){
@Override
public void configure() {
bind(pipeline).to(ServiceXYZ.class);
}
});
}
然后您可以将 ServiceXYZ
注入您的任何资源 classes 或提供者(如过滤器)。
@Path("..")
public class Resource {
@Inject
ServiceXYZ pipeline;
@GET
public Response get() {
pipeline.doSomething();
}
}
以上配置将单例(singleton)实例绑定到框架。
Extra :-) 不适用于您的用例,但例如您希望为每个请求创建一个新的服务实例。然后你需要把它放在请求范围内。
bind(ServiceXYZ.class).to(ServiceXYZ.class).in(RequestScoped.class);
请注意 bind
中的差异。第一个使用实例,而第二个使用 class。无法在请求范围内以这种方式绑定实例,因此如果需要特殊初始化,则需要使用 Factory
。你可以在我上面提供的 link