2

这是您可以配置和/或依赖于您的应用程序服务器的东西吗?我想知道当您重新部署应用程序时是否会重建单例对象。

我宁愿在这里问并尝试得到一个简洁的答案,而不是随机搜索或诉诸阅读 J2EE Servlet Specs -

4

2 回答 2

1

不,它不会(至少我知道没有应用服务器)。servlet 规范为您提供了管理应用程序生命周期的ServletContextListener挂钩。一些应用程序服务器(如 JBoss)为单例 bean (@Service) 提供了特殊注释,而 EJB 3.1 为您提供了 @Singleton 注释。使用单例时要考虑的另一件事是,当您对应用程序进行集群时会发生什么,您将需要高可用性 (HA) 或使用某种类型的复制,除非您使用无共享方法。出于这个原因,分布式缓存很好。

于 2009-05-15T18:54:09.960 回答
1

这个问题的简短回答是否定的。我不知道任何以这种方式运行的应用程序服务器。但是,有几点需要指出。下面是一个简单的解释:

当您的应用程序服务器(即带有 Tomcat 的 JBoss)启动时,它会在类加载器中加载一些类,这些类将由所有应用程序共享。当它部署你的应用程序时,它会将这些类加载到它自己的类加载器中。当您取消部署应用程序时,该类加载器及其所有类都将被垃圾回收。因此,当重新部署应用程序时,您的所有类都将重新加载,并且您的单例将被重新实例化。

您的应用程序将(理论上,至少)在重新部署后表现相同,就像在 JVM/Application Server 重新启动后一样。

最后的提示:如果您想在您的企业 Java 应用程序中使用单例模式,请确保您了解单例对象在应用程序服务器环境中的局限性。例如,如果您想对应用程序进行集群化,您可能会遇到问题。

于 2009-05-15T19:05:18.450 回答