java - Web 服务处理程序中的静态 block

标签 java multithreading web-services jax-ws

我有一个带有多个处理程序的 jax-ws Web 服务。我有一个特定的对象,启动它的性能成本很高。我需要这个对象来处理每个发送到 Web 服务的请求。

是否可以将此对象放入静态 block 中?由于静态 block 是在类加载时创建的,因此会提高性能。但它仍然达到了我所需要的。我需要将相同的对象保留在内存中并重用于所有请求。但据我所知,在 Web 服务中,每个请求都分配给静态 block 中的线程对象,不会被线程共享。这是?

期待这里的一些解释。

谢谢

最佳答案

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

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 或 Web 服务)中执行此操作,您需要确保 LanguageLookup 的状态在初始化后无法更改。如果它使用自己的依赖项来执行初始化以外的操作,那么这些操作也必须是无状态的。

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

使用像Spring这样的依赖注入(inject)框架来设置非常容易singletons :

When a bean is a singleton, only one shared instance of the bean will be managed and all requests for beans with an id or ids matching that bean definition will result in that one specific bean instance being returned.

在应用程序上下文中,您会看到类似以下内容:

<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;
    }
}

关于java - Web 服务处理程序中的静态 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16911564/

相关文章:

java - JAVA无法读取字符串结尾

c# - 处理来自 BeginInvoke 的异常的方法?

c++ - 无法使用在同一类中使用成员函数的线程进行编译

multithreading - 通过jax ws实现的web service是多线程的吗

.net - 切换到发布版本会导致 Web 引用中出现运行时错误

java - Jackson多态序列化: how to remove super type property wrapper?

java - 如何查找两个表之间的关系?

java - 设置接口(interface)Java

java - 在java中如何为多个线程创建通用进度指示器

java - 如何使用 WSDL