我们可以在servlet中创建一个非参数化的构造函数吗?

时间:2015-05-30 16:02:31

标签: java servlets constructor

到目前为止我所知道的事情:

  • Servlet的实例首先由容器通过反射创建,并使用no argument constructor
  • 然后调用parameterized init方法。

还建议我们不要在servlet类中创建构造函数,因为它没用。我同意这一点。

让我们说,我在servlet类中创建了一个无参数构造函数,从内部我调用了一个参数化构造函数。我的问题是,容器会调用它吗?

public class DemoServlet extends HttpServlet{  
   public DemoServlet() {
      this(1);
   }
   public DemoServlet(int someParam) {
      //Do something with parameter
   }
}

容器会调用DemoServlet(),如果我们在其中放入一些初始化内容,它会被执行吗?我的猜测是肯定的,但根据我的理解,这只是猜测。

这可能是无用的,我是出于好奇而问。

2 个答案:

答案 0 :(得分:2)

将调用

DemoServlet()(因为您将覆盖HttpServlet中定义的no-arg构造函数(这是一个无操作的构造函数)。

然而,其他DemoServlet(int arg)将不会被调用。

答案 1 :(得分:1)

你的猜测是正确的。 DemoServlet()将由容器调用,其中的任何初始化代码都将被执行 - 即使初始化是通过构造函数链进行的,事实上这是一个很好的方法来进行依赖注入并创建一个线程安全的可测试的servlet 通常会以这种方式编写

public class DemoServlet extends HttpServlet
{
   private final someParam; //someParam is final once set cannot be changed

   //default constructor called by the runtime.
   public DemoServlet()
   {
       //constructor-chained to the paramaterized constructor
       this(1);
   }

   //observe carefully that this paramaterized constructor has only
  //package-level visibility. This is useful for being invoked through your
  //  unit and functional tests which would typically reside within the same 
  //package. Would also allow your test code to inject required values to 
 //verify behavior while testing.
   DemoServlet(int someParam)
   {
      this.param = param
   }

   //... Other class code...
}