HttpServlet是不是Singleton设计模式

本文解析了HttpServlet源代码,指出其构造函数为public,且未提供static getInstance方法,故并非Singleton模式。讨论了Java Servlet Specification对于Servlet实例创建的规定,并解释了不同Servlet配置下实例创建的灵活性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

描述:

在很多书上都提到HttpServlet都是Singleton模式,因此在Servlet Container里面只会创建一个HttpServlet实例,事实是这样的吗?


代码解析:

public abstract class HttpServlet extends GenericServlet {
    ...
    
    public HttpServlet() {
        // NOOP
    }
    
    ...
}

我们分析HttpServlet源代码就会发现,其提供了一个public的构造函数,此外也不能找到static的getInstance方法。明显这个和Singleton设计模式有背,那为什么很多书中会提到HttpServlet是Singleton模式。


Java Servlet Specification:

The servlet declaration which is either via the annotation as described in Chapter 8, “Annotations and pluggability” or part of the deployment descriptor of the Web application containing the servlet, as described in Chapter 14, “Deployment Descriptor”, controls how the servlet container provides instances of the servlet. For a servlet not hosted in a distributed environment (the default), the servlet container must use only one instance per servlet declaration. However, for a servlet implementing the SingleThreadModel interface, the servlet container may instantiate multiple instances to handle a heavy request load and serialize requests to a particular instance.


结论:

HttpServlet的实现其实并不是Singleton模式,只是很多Servlet Container只创建了一个Servlet实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值