java之Servlet的生命周期(适合新人)

最近有人私信我说,我写的博客有些肤浅,没有深究,在此我统一回复一下,这些博客大多都是概念性东西,是用通俗的例子让你理解这个技术或者知识到底是怎么一样原理。
所以我在后面都加着适合新人,我们都是从新人走过来的,知道初学者的那种迷茫,只会代码,不懂原理和含义,就比如,注解,你不去学习理解,初学者根本就不知道那是个什么东西,为什么要使用注解。
如果是资深大牛,那就不要看了,还是那句话,适合新人。

1,生命周期

servlet 声明周期可以分四个阶段:

  1. 类装载过程
  2. init() 初始化过程
  3. service() 服务过程,选择doGet \ doPost
  4. destroy() 销毁过程

代码模拟:

package com.aaa.Servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 
* 项目名称:ServletDemo  
* 类描述:("Servlet生命周期")
* 创建人:莫参商 
* 创建时间:2020-1-15 下午4:18:24  
* 修改人:acer     
* @version   
*   
 */
@WebServlet("/ServletDemo02")
public class ServletDemo02 extends HttpServlet{
	
	//初始化,也可以称为开始
	@Override
	public void init() throws ServletException {
		System.out.println("Servlet开始咯... ...init()");
	}
	//service 请求发送   里面有 常用:get post  不常用:put delete 	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		System.out.println("代码被执行... ...");
	}
	@Override
	public void destroy() {
		System.out.println("Servlet销毁咯... ...destroy()");
	}
}

在这里插入图片描述

2,Servlet是单例,线程安全问题!

首先我们要知道,Servlet是单例模式,也就是说它只能被实例化一次。
我曾经面试的时候,面试官问我,你怎么证明Servlet是单例模式的?
怎么证明?
单例的特征,构造函数只会运行一次。
所以写一个构造函数就ok了

证明Servlet是单例

@WebServlet("/ServletDemo02")
public class ServletDemo02 extends HttpServlet{
	
	public ServletDemo02(){
		System.out.println("啦啦啦,我是ServletDemo02的构造函数!");
	}
	
	//初始化,也可以称为开始
	@Override
	public void init() throws ServletException {
		System.out.println("Servlet开始咯... ...init()");
	}
	//service 请求发送   里面有 常用:get post  不常用:put delete 	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		System.out.println("代码被执行... ...");
	}
	@Override
	public void destroy() {
		System.out.println("Servlet销毁咯... ...destroy()");
	}
}

在这里插入图片描述
看结果,多次访问,但是构造函数只创建了一次,所以可以证明Servlet是单例。
init()方法是servlet自带的,本来就是执行一次,所以它无法成为是否为单例的证据。

拓展面试题:

怎么证明Servlet是单例模式的?
单例的特征,构造函数只会运行一次。

发布了14 篇原创文章 · 获赞 15 · 访问量 4255

猜你喜欢

转载自blog.csdn.net/qq_41566219/article/details/103991141
今日推荐