我在面试中被问到一个问题,你将如何阻止 Servlet 实例化 servlet 对象?
我说容器决定销毁 servlet 对象。
他又说容器会先创建servlet对象,然后再销毁它。我的问题是尚未创建 servlet 对象,因此销毁它没有意义。当一个 servlet 类试图实例化自己陷入严重问题并且我们的代码(或任何其他方式)应该阻止它实例化时,您将如何编写它?
我猜他期待你javax.servlet.UnavailableException
从init()
public class UnavailableException extends ServletException 此异常表示 servlet 不可用。Servlet 可能随时报告此异常,并且运行 Servlet 的网络服务应该正常运行。有两种类型的不可用性,复杂的服务将以不同的方式处理这些问题:
永久不可用。在采取一些管理措施来纠正 servlet 问题之前,servlet 将无法处理客户端请求。例如,servlet 可能配置错误,或者 servlet 的状态可能已损坏。编写良好的 servlet 将记录错误和管理员必须执行的纠正操作以使 servlet 可用。
暂时不可用。由于系统范围的问题,servlet 目前无法处理请求。例如,第三层服务器可能无法访问,或者可能没有足够的内存或磁盘存储来处理请求。问题可能是自我纠正的,例如由于负载过大而导致的问题,或者可能需要管理员采取纠正措施。
您可以通过三种方式阻止容器创建 Servlet 实例:
删除 web.xml 中对 Servlet 的引用。如果你的容器正在处理注解,那么@WebServlet
注解也需要被移除。
在构造函数中,抛出异常。
在 init() 方法中,抛出异常。
没错,容器负责 servlet 创建和生命周期。它首先使用默认的公共构造函数创建 servlet 实例,然后调用其init()
方法。当容器想要销毁 servlet 时,它会调用其destroy()
通常(恕我直言)为空的方法。
容器在部署可能是您的应用程序的新版本时,可以在热重新部署期间首先销毁然后创建新的 servlet。这可能是你的面试官想从你那里听到的。