我有一个Java Web应用程序。
我可以通过init()
中的参数指定在servlet上调用web.xml
方法的顺序:
<load-on-startup>1</load-on-startup>
但是,如何指定调用destroy()
方法的顺序?
实际上,我需要做的就是最后关闭log4j。但事先我想知道是否有一些调用destroy()
方法的规则。
答案 0 :(得分:8)
我查看了Servlet 3.0规范。它没有定义必须调用destroy
方法的顺序的任何规则。因此,它未指定,并且不应依赖任何供应商特定的行为。不释放在 Servlets 之间共享资源的第二个原因是,如果容器选择这样做,则可以随时销毁给定的Servlet。请参阅Servlet 3.0规范的2.3.4节:
2.3.4服务终止
servlet容器不需要为任何特定的服务器加载servlet 一段的时间。 servlet实例可以在servlet容器中保持活动状态 servlet容器的生命周期的毫秒数(可能是一个 天数,月数或年数,或介于两者之间的任何时间。
当servlet容器确定应该从中删除servlet时 service,它调用Servlet接口的destroy方法以允许servlet 释放它正在使用的任何资源并保存任何持久状态。例如, 容器可能会在想要节省内存资源时执行此操作,或者何时执行此操作 被关闭
假设您有3个Servlet - A,B和C.如果A和B依赖于C管理的资源,则容器可能会通过调用其destroy
方法来决定暂时禁用C。因此A和B将无法再访问这些资源。我必须承认,我从未在现实中看到过这种行为。
<强>建议:强>
使用ServletContextListener。它保证只被初始化和销毁一次。