Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java web服务处理程序中的静态块_Java_Multithreading_Web Services_Jax Ws - Fatal编程技术网

Java web服务处理程序中的静态块

Java web服务处理程序中的静态块,java,multithreading,web-services,jax-ws,Java,Multithreading,Web Services,Jax Ws,我有一个带有多个处理程序的jax-ws-web服务。我有一个特定的对象,从性能角度来看,启动该对象的成本很高。我需要这个对象来处理每个到web服务的请求 将此对象放入静态块是一种解决方案吗?由于静态块是在类加载时创建的,因此它将提高性能。但它仍然实现了我所需要的。我需要相同的对象保存在内存中,并对所有请求重复使用。但正如我所知,在web服务中,每个请求都被分配给静态块中的线程对象,线程不会共享。是吗 希望大家能解释一下 谢谢静态块是一段代码,在类装入器初始化类时运行一次。您可以使用它来设置复杂对

我有一个带有多个处理程序的jax-ws-web服务。我有一个特定的对象,从性能角度来看,启动该对象的成本很高。我需要这个对象来处理每个到web服务的请求

将此对象放入静态块是一种解决方案吗?由于静态块是在类加载时创建的,因此它将提高性能。但它仍然实现了我所需要的。我需要相同的对象保存在内存中,并对所有请求重复使用。但正如我所知,在web服务中,每个请求都被分配给静态块中的线程对象,线程不会共享。是吗

希望大家能解释一下


谢谢

静态块是一段代码,在类装入器初始化类时运行一次。您可以使用它来设置复杂对象,然后在静态变量中保留对它的引用,如下所示:

public class MyClass {

    private static final LanguageLookup languageLookup;

    static {
        languageLookup = new LanguageLookup ();
        languageLookup.loadData();
    }

    public Response handleRequest(Request request) {
        String language = languageLookup.lookup(request.getCountryCode());
        response.setLanguage(language);
        return response;
    }
}
如果在servlet或webservice等多线程环境中执行此操作,则需要确保LanguageLookup的状态在初始化后不会更改。如果它将自己的依赖项用于初始化以外的操作,则这些依赖项也必须是无状态的

我认为这样做通常不是一个好主意,因为您将您的类硬连接到LanguageLookup,使其紧密耦合,更难进行单元测试

使用像Spring这样的依赖项注入框架来设置:

当一个bean是单例时,只有一个bean的共享实例将被调用 被管理,并且所有对具有一个或多个与之匹配的id的bean的请求 bean定义将导致生成一个特定的bean实例 返回

在应用程序上下文中,您可能会遇到以下情况:

<bean name="languageLookup" class="com.acme.foo.LanguageLookup" singleton="true" init-method="loadData"/>

静态变量由线程共享。但是,它们不一定是线程安全的。如果对象是线程安全的,这可能是一个选项。它是只读对象。但静态块不会与线程中的共享。是不是?
public class MyClass {

    private LanguageLookup languageLookup;

    public Response handleRequest(Request request) {
        String language = languageLookup.lookup(request.getCountryCode());
        response.setLanguage(language);
        return response;
    }

    // called by Spring
    public void setLanguageLookup(LanguageLookup languageLookup) {
        this.languageLookup = languageLookup;
    }
}