读一些书说servlet是容器方面的单例。这是真的吗?
然而,即使是单身,我们也需要处理数据同步等
答案 0 :(得分:24)
查看Cunningham & Cunningham, Inc. Wiki
中定义的单例模式的定义确保一个类只有一个实例,并提供一个全局访问点。
我会说,不。从容器的角度来看,接受并管理一个servlet对象,包括创建ServletContext,但它不会阻止servlet的实例不多。
关于这些问题,我认为最好查看相应的合同,这是在Java Servlet Specification中定义的servlet的情况。他们已经解决了servlet实例的数量。
2.2实例数
servlet声明,它通过注释为 在第8章“注释和可插拔性”或部分内容中描述 包含servlet的Web应用程序的部署描述符, 如第14章“部署描述符”中所述,控制如何 servlet容器提供servlet的实例。 对于servlet而不是 托管在分布式环境(默认)servlet中 容器必须每个servlet声明只使用一个实例。然而, 对于实现SingleThreadModel接口的servlet, servlet容器可以实例化多个实例以处理繁重的事件 请求加载并将请求序列化到特定实例。
在将servlet部署为应用程序的一部分的情况下 在部署描述符中标记为可分发,容器可以 每个Java Virtual每个servlet声明只有一个实例 机器(JVM™)。但是,如果servlet处于可分发状态 application实现了SingleThreadModel接口,即容器 可以在每个JVM中实例化该servlet的多个实例 容器
它只指定容器必须只使用一个实例(在前一种情况下),而 EJP 在注释中指出:
Servlet规范中没有任何内容可以阻止您 在。中以不同的名称重新实例化相同的servlet类 相同的网络应用程序。 Ergo,不是单身人士。
参考 Java Servlet Specification 3.0 MR(第6-7页)
答案 1 :(得分:14)
没有。您可以在同一Web容器中的不同servlet名称和URL下多次实例化同一个servlet类,实际上也可以在同一个Web应用程序中。
答案 2 :(得分:0)
Servlet 可以初始化为单个实例或实例池。
以下摘自 <
Web 容器通常会创建一个线程来处理每个请求。为了确保一个 servlet 实例一次只处理一个请求,一个 servlet 可以实现 SingleThreadModel 接口。如果一个 servlet 实现了这个接口,则没有两个线程 将在 servlet 的服务方法中并发执行。一个 Web 容器可以 通过同步对单个实例的访问来实现此保证 servlet 或通过维护一个 Web 组件实例池并分派每个 对免费实例的新请求。
答案 3 :(得分:-2)
不,Servlet不是Singleton。它可能会创建第二个对象,取决于传入请求和Container行为。