今天在看《看透 Spring MVC 源代码分析与实践》一书的 【6.2 GenericServlet】 这个章节的时候,有几段话是这么说的:
GenericServlet 实现了 Servlet 的 init(ServletConfig config) 方法,在里面将 config 设置给了内部变量 config,然后调用了无参的 init() 方法,这个方法是个模板方法,在子类中可以通过覆盖它来完成自己的初始化工作,代码如下:
// javax.servlet.GenericServlet
public void init(ServletConfig config) throws ServletException {
this.config = config;
this.init();
}
public void init() throws ServletException {
}
这种做法有三个作用:首先,将参数 config 设置给了内部属性 config,这样就可以在 ServletConfig 的接口方法中直接调用 config 的相应方法来执行;其次,这么做之后我们在写 Servlet 的时候就可以只处理自己的初始化逻辑,而不需要再关心 config 了;还有一个作用就是在重写 init 方法时也不需要再调用 super.init(config)了。如果在自己的 Servlet 中重写了带参数的 init 方法,那么一定要记着调用 super.init(config),否则这里的 config 就接收不到值,相应的 ServletConfig 方法也就不能执行了。
请问,“还有一个作用就是在重写 init 方法时也不需要再调用 super.init(config)了。如果在自己的 Servlet 中重写了带参数的 init 方法,那么一定要记着调用 super.init(config),否则这里的 config 就接收不到值,相应的 ServletConfig 方法也就不能执行了”怎么理解?
으아아아
이것이
Java
다형성의 특징입니다. 대상 유형이 상위 클래스의 메서드를 재정의하면 실행 중에 대상 유형의 메서드가 실행됩니다. 즉,init(ServletConfig config)
을 다시 작성하면Servlet
은 초기화 중에 다시 작성한 함수를 실행하지만GenericServlet
의 기능은 실행하지 않고GenericServlet.config
은 초기화되지 않습니다.config
이 초기화되지 않은 상태에서getServletContext()/getInitParameter("k")
등 상위 클래스에서 제공하는 메서드를 호출하면IllegalStateException
예외가 발생합니다.따라서
super.init(config)
을 명시적으로 실행해야 합니다. 물론 가장 좋은 방법은init()
메서드 대신init(ServletConfig config)
메서드를 재정의하는 것을 선택하는 것입니다.