Servlet生命周期和PostConstruct、PreDestroy

Servlet 是什么

Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层

使用 Servlet,您可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。

参考整理:https://www.zhihu.com/question/21416727

servlet就是一个Java接口

所以说网络协议、http什么的,servlet根本不管!也管不着!

那servlet是干嘛的?很简单,接口的作用是什么?规范呗!

servlet接口定义的是一套处理网络请求的规范,所有实现servlet的类,都需要实现它那五个方法,其中最主要的是两个生命周期方法 init()destroy(),还有一个处理请求的service(),也就是说,所有实现servlet接口的类,或者说,所有想要处理网络请求的类,都需要回答这三个问题:

  1. 你初始化时要做什么
  2. 你销毁时要做什么
  3. 你接受到请求时要做什么

这是Java给的一种规范!就像阿西莫夫的机器人三大定律、行尸走肉里Rick的那三个问题一样,规范!

servlet只是一个规范,实现了servlet的类,不能处理请求。

你可以随便谷歌一个servlet的hello world教程,里面都会让你写一个servlet,相信我,你从来不会在servlet中写什么监听8080端口的代码,servlet不会直接和客户端打交道

那请求怎么来到servlet呢?答案是servlet容器,比如我们最常用的tomcat,同样,你可以随便谷歌一个servlet的hello world教程,里面肯定会让你把servlet部署到一个容器中,不然你的servlet压根不会起作用。

tomcat才是与客户端直接打交道的家伙,他监听了端口,请求过来后,根据url等信息,确定要将请求交给哪个servlet去处理,然后调用那个servlet的service方法,service方法返回一个response对象,tomcat再把这个response返回给客户端。

socket 和 servlet

socket是一个tcp连接协议的java实现,有了这个就能建立tcp连接收发任何基于tcp层消息。而servlet是在http容器(比如tomcat)在建立tcp连接并接收到并解析完http消息后,将http消息的内容封装成servlet request交给你实现的servlet处理的,也就是说你想处理一个tomcat接收来的http消息,你按它要求实现了一个servlet,并加上映射,tomcat就能把它接到的http消息内容送到你的处理器(你实现的servlet)去处理你的逻辑,期间的网络连接内容解析什么的它都帮你搞了。

SpringBoot中的Bean初始化方法

@PostConstruct详解

从Java EE 5规范开始,Servlet中增加了两个影响Servlet生命周期的注解:@PostConstruct和@PreDestroy。这两个注解只会被服务器调用一次。这两个注解被用来修饰一个非静态的void()方法 。写法两种方式,说一下下面这种常用方式。

@PostConstruct
Public void someMethod() {
}

其实就是初始化的顺序问题:

执行顺序: 父类静态变量或静态语句块–>子类静态变量或静态语句块->父类实例变量或初始化语句块–>父类构造方法->子类实例变量或初始化语句块->子类构造方法–> @Autowired -> @PostConstruct….-> destroy -> @PreDestroy

应用场景

1.Spring项目加载数据字典

@PostConstruct注解的方法在项目启动的时候执行这个方法,也可以理解为在spring容器启动的时候执行,可作为一些数据的常规化加载,比如数据字典之类的。

2.Spring项目的定时任务

spring自带的@schedule,没有开关,项目启动总会启动一个线程;做项目的时候就使用Java的timer,这个设置开关即可自由的控制,关闭的时候,不会启动线程

Java的timer也需要找到一个启动类,可以放到main函数里面启动,这样的话,代码的耦合性太高了,而使用PostConstruct是很干净的。

如以下代码:

@Autowired
    private Scheduler scheduler;

    @PostConstruct
    public void init(){
        List<ScheduleJobEntity> scheduleJobList = this.list();
        for(ScheduleJobEntity scheduleJob : scheduleJobList){
            CronTrigger cronTrigger = ScheduleUtils.getCronTrigger(scheduler, scheduleJob.getJobId());
            if(cronTrigger == null) {
                ScheduleUtils.createScheduleJob(scheduler, scheduleJob);
            }else {
                ScheduleUtils.updateScheduleJob(scheduler, scheduleJob);
            }
        }
    }

   转载规则


《Servlet生命周期和PostConstruct、PreDestroy》 锦泉 采用 知识共享署名 4.0 国际许可协议 进行许可。
  目录