为什么我们不能使用构造函数本身初始化servlet?

Red*_*ddy 4 java servlets initialization java-ee

为什么我们必须覆盖Servlet中的init()方法,同时我们可以在构造函数中进行初始化并让web容器调用构造函数,在调用构造函数时将ServletConfig引用传递给servlet?

Ofcourse容器必须使用反射,但容器必须使用反射来调用简单的无参数构造函数

Pét*_*rök 15

由于构造函数不能是接口的一部分,因此与常规方法不同,它不能在Servlet API中"正式"指定.此外,由于Java没有析构函数,destroy因此无论如何都需要一种方法,因此定义相应的init方法会使API更加一致且易于使用.

使用反射来检测/验证构造函数参数会使事情变得不必要,并且我没有看到任何附加值.


leo*_*kot 5

Servlet对象具有明确定义的生命周期,其中创建和初始化步骤是不同的.通常,您不希望在构造函数中执行繁重且不可靠的工作,例如获取数据库连接池或初始化缓存.成功创建Servlet对象后,您有机会执行此操作.

此外,这里http://oreilly.com/catalog/jservlet/chapter/ch03.html是一个历史原因:

init()方法通常用于执行servlet初始化 - 创建或加载servlet在处理其请求时使用的对象.为什么不使用构造函数呢?好吧,在JDK 1.0(最初编写servlet)中,动态加载的Java类(例如servlet)的构造函数不能接受参数.

因此,为了向新的servlet提供有关其自身及其环境的任何信息,服务器必须调用servlet的init()方法并传递实现ServletConfig接口的对象.

此外,Java不允许接口声明构造函数.这意味着javax.servlet.Servlet接口不能声明接受ServletConfig参数的构造函数.它必须声明另一个方法,如init().当然,您仍然可以为servlet定义构造函数,但在构造函数中,您无权访问ServletConfig对象或抛出ServletException的能力.