servlet 是单例吗?

2022-09-01 10:52:49

读过一些书,说servlet从容器侧是单例的。这是真的吗?

然而,即使它是一个单例,我们也需要处理数据同步等


答案 1

查看 Cunningham & Cunningham, Inc. Wiki 中定义的 Singleton Pattern 的定义

确保一个类只有一个实例,并提供对它的全局访问点。

我会说,不。从容器的角度来看,一个 Servlet 对象被接受和管理,包括创建一个 ServletContext,但它不会阻止 Servlet 的实例不超过一个。

关于这些问题,我认为最好研究一下相应的契约,这是在Java Servlet规范中定义的servlet的情况下。他们已经解决了 servlet 的实例数。

2.2 实例数量

servlet 声明要么通过第 8 章 “注释和可插入性”中所述的注释,要么通过包含 servlet 的 Web 应用程序的部署描述符的一部分(如第 14 章 “部署描述符”中所述),控制 servlet 容器如何提供 servlet 的实例。对于不在分布式环境中托管的 servlet(缺省值),Servlet 容器每个 servlet 声明必须只使用一个实例。但是,对于实现 SingleThreadModel 接口的 servlet,servlet 容器可以实例化多个实例来处理繁重的请求负载,并将请求序列化到特定实例。

在将 servlet 部署为部署描述符中标记为可分发的应用程序的一部分的情况下,容器的每个 Java 虚拟机 (JVM™) 的每个 servlet 声明可能只有一个实例。但是,如果可分发应用程序中的 servlet 实现了 SingleThreadModel 接口,则容器可能会在容器的每个 JVM 中实例化该 servlet 的多个实例。

它仅指定容器必须仅使用一个实例(在前一种情况下),并且正如 EJP注释中指出的那样:

Servlet 规范中没有任何内容可以阻止您在同一 Web 应用程序中以不同的名称重新实例化同一个 Servlet 类。因此,不是单例。

参考 Java Servlet 规范 3.0 MR (页 6-7)


答案 2

不。您可以在同一 Web 容器中以及同一 Web 应用程序中的不同 servlet 名称和 URL 下多次实例化同一个 servlet 类。


推荐