如果我在 Struts 动作中实例化一个 Singleton 类,它对于其他请求触发该动作是否会持续存在?
我的意思是,如果我在一个 Struts 动作代码中并且我写:
Singleton object = Singleton.getInstance();
当另一个用户启动相同或另一个需要该对象的操作时,该对象是否存在?
如果我在 Struts 动作中实例化一个 Singleton 类,它对于其他请求触发该动作是否会持续存在?
我的意思是,如果我在一个 Struts 动作代码中并且我写:
Singleton object = Singleton.getInstance();
当另一个用户启动相同或另一个需要该对象的操作时,该对象是否存在?
一个正确实现Singleton
的将在您的应用程序的上下文中构建一次,并且一旦创建将在 JVM 中重新使用。单例模式维基百科页面(部分)说,
在软件工程中,单例模式是一种将类的实例化限制为一个对象的设计模式。当需要一个对象来协调整个系统的动作时,这很有用。
是的。ASingleton
是全局变量的一种形式,因此所有用户只会共享一个实例。
我明白你的疑问:
由于 Struts2 Actions 是ThreadLocal
,因此每个动作,在每个请求上,都会创建其对象的一个实例,单例行为是否正确?
从您的代码看来,您指的是pre-1.5* Singleton:
public class Singleton {
private static final Singleton INSTANCE = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return INSTANCE;
}
}
答案是肯定的:
私有静态最终单例实例=新单例();
因为static
“赢得”了ThreadLocal
,并使其独一无二(实例化一次,然后共享)。
*请注意,如果您使用的是 Java EE >= 6,则有很多方法可以比这更好地处理单例,使用 CDI、EJB3 等……例如@Singleton
EJB 或@Singleton
注入。