HttpServlet的生命周期是什么?

2022-09-01 19:53:32

基本上,一个 servlet 的实例存在了多长时间?我有点猜测这是会话范围。但是,我认为它可能有某种超时或垃圾回收来删除旧实例。


答案 1
  • Servlet 是在应用程序启动(部署在 servlet 容器上)或首次访问它时(取决于设置)创建的load-on-startup
  • 当 servlet 实例化时,servlet 的方法称为init()
  • 然后 servlet(它的唯一一个实例)处理所有请求(它的方法被多个线程调用)。这就是为什么不建议在其中进行任何同步的原因,并且您应该避免使用servlet的实例变量。service()
  • 当应用程序被取消部署(servlet 容器停止)时,将调用该方法。destroy()

答案 2

生命周期定义得很好,并通过在 Servlet 的 init、service 和 destroy 方法中公开的生命周期方法公开。

而且,尽管这里还说了些什么,但这是您可以从规范中指望的一切。基本上,您将获得这三种方法,并保证Servlet不是线程安全的。单个 servlet 可以由一个或多个请求同时访问。

规范中没有任何内容将 servlet 限制为容器的一个实例,如果容器决定这样做,它可以获取请求,创建一个 servlet,调用它的 init,然后提供服务,然后销毁方法,并将其设置为空闲以进行垃圾回收。

各个容器可能具有不同的实现。

大多数容器都会创建单个实例。但是规范并不能保证这一点,所以你不应该依赖它。

另外,考虑像Google App Engine这样的东西。GAE非常激进,不断过期并关闭没有流量的整个Web应用程序。如果你有一个轻易浏览的网站,你完全可以期望整个应用程序启动,初始化其所有服务,初始化任何加载启动servlet,执行请求,然后关闭所有内容。因此,在GAE上,您必须拥有非常快速的应用程序启动,以保持任何性能。

所以,简单地说,你可以指望的是规范所说的。单个容器可能提供不同的运行时体验。