servlet是单身人士吗?

时间:2012-08-05 23:05:21

标签: java servlets

读一些书说servlet是容器方面的单例。这是真的吗?

然而,即使是单身,我们也需要处理数据同步等

4 个答案:

答案 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行为。