在 struts 操作中创建的单例是否会持续存在?

Will a singleton created in struts action persist?

如果我在 Struts 操作中实例化一个单例 class,它是否会持续用于启动该操作的其他请求?

我的意思是,如果我在 Struts 操作代码中并且我写:

Singleton object = Singleton.getInstance();

当另一个用户启动需要该对象的相同或另一个操作时,该对象是否存在?

一个"Single"实例

正确实现的 Singleton 将在您的应用程序上下文中构建一次,一旦创建,将在 JVM 中重复使用。 Singleton pattern 维基百科页面说(部分),

In software engineering, the singleton pattern is a design pattern that restricts the instantiation of a class to one object. This is useful when exactly one object is needed to coordinate actions across the system.

tl;博士

是的。 Singleton是全局变量的一种形式,因此所有用户只会共享一个实例。

我理解你的疑问:

因为 Struts2 操作是 ThreadLocal,因此每个操作根据每个请求创建其对象的一个​​实例,单身人士的行为是否正确

从你的代码看来你指的是 pre-1.5* Singleton:

public class Singleton {
    private static final Singleton INSTANCE = new Singleton();

    private Singleton() {}

    public static Singleton getInstance() {
        return INSTANCE;
    }
}

答案是:

private static final Singleton INSTANCE = new Singleton();

因为 static "wins" 超过 ThreadLocal,并使其 唯一 (实例化一次,然后共享)。


*请注意,如果您使用 Java EE >= 6,有许多方法可以比这更好地处理单例,例如 CDI、EJB3 等...例如 @Singleton EJB 或@Singleton 次注射。