Servlet 是单例模式吗?

49 浏览
0 Comments

Servlet 是单例模式吗?

这个问题在这里已经有答案:Servlets是如何工作的?实例化、会话、共享变量和多线程

我看了一些书,书里说Servlet是从容器一侧的单例。这是真的吗?

即使是单例,我们也需要处理数据同步等问题。

admin 更改状态以发布 2023年5月23日
0
0 Comments

不可以。在同一Web容器中,甚至在同一Web应用程序中,可以使用不同的Servlet名称和URL多次实例化相同的Servlet类。

0
0 Comments

Cunningham & Cunningham, Inc. Wiki 定义单例模式,

确保一个类只有一个实例,并提供全局访问接口。

我认为,不太对。从容器的角度来看,只有一个 servlet 对象被接受和管理,包括创建ServletContext,但它并不能防止 servlet 的实例化数量超过一个。

就这类问题而言,我认为最好看对应的契约,这在 Servlet 中已定义在Java Servlet Specification中。他们已经解决了 servlet 数量的问题。

2.2 实例数量

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

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

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

在 Servlet 规范中没有防止您在同一 Web 应用程序中使用不同名称重新实例化相同的 servlet 类的内容。因此,它不是一个单例。

参考文献 Java Servlet Specification 3.0 MR (p.6-7)

0