@PostConstruct和@PreDestroy与servlet生命周期的关系

news2024/11/29 6:32:36

执行顺序结果

/**
 * 服务器加载Servlet
 * ---> 创建servlet实例,实现servlet构造函数
 * ---> 执行注解@PostConstruct
 * ---> servlet.Init()
 * ---> servlet/service() 方法
 * ---> 执行注解@PreDestroy
 * ---> servlet.destroy()
 * ---> 服务器卸载Servlet完毕
 */

servlet生命周期

1.web服务器启动时,会对servlet进行实例化操作
2.第一次访问servlet时,会调用init方法进行初始化操作,这个操作只进行一次
3.每次访问servlet时,都会调用service方法进行真正的请求和响应
4.web服务器关闭时,会调用destroy进行销毁操作
5.在整个生命周期期间,init()和destroy()都各执行一次
6.与web服务器同生共死

 

Servlet的init()、destory()和Spring的PostConstruct、PreDestroy

Servlet 的 init() 和 destroy()

在 Servlet 的生命周期中,init() 和 destroy() 方法的作用分别是:

  1. init(): 此方法在 Servlet 实例化后立即调用,用于执行一次性的初始化工作(例如,打开数据库连接、初始化配置设置等)。Servlet 容器在部署后首次接收到对该 Servlet 的请求时,或者服务器启动时,会创建 Servlet 实例并调用其 init() 方法。

  2. destroy(): 此方法在 Servlet 的生命周期结束时调用,用于执行清理工作(例如,关闭数据库连接、释放资源等)。当服务器关闭,或者 Servlet 容器决定卸载 Servlet 时,会调用 destroy() 方法。

Spring 的 @PostConstruct 和 @PreDestroy

与 Servlet 的 init() 和 destroy() 类似,Spring 框架的 @PostConstruct 和 @PreDestroy 注解也用于执行一次性的初始化和清理工作,但是它们是基于 Java 的 JSR 250 标准,所以不仅限于 Spring:

  1. @PostConstruct: 此注解标记在一个方法上,表明该方法应在 bean 的所有必需依赖项已被 Spring 容器注入后调用,且在第一次对其他 bean 的使用之前。通常,此方法用于一次性的初始化工作。

  2. @PreDestroy: 此注解标记在一个方法上,表明该方法应在 bean 被容器销毁之前调用。通常,此方法用于执行清理工作。

即:@PostConstruct和@PreDestroy在整个服务运行过程中,有且只会被服务调用一次;

不同的是@PostConstruct是在服务启动的时候,一般用来init初始化配置与servlet中init()方法类似;而@PreDestroy是在服务结束的时候,一般用来清理资源,比如关闭线程池,与servlet中destory()方法类似;

 总的来说,无论是 Servlet 的 init() 和 destroy() 方法,还是 Spring 的 @PostConstruct 和 @PreDestroy 注解,它们的选择主要取决于你所处的环境以及你想要在何时执行初始化和清理工作。如果你在编写一个 Servlet,那么你可能需要使用 init() 和 destroy()。如果你在使用 Spring 框架,那么 @PostConstruct 和 @PreDestroy 就是好选择。

注意:在新版本JDK中, @PostConstruct和@PreDestroy并不在“javax.annotation.”包下面,而是在“jakarta.annotation.”包下面;

下面是测试案例

创建一个ServletDemo类

public class ServletDemo {
    public ServletDemo() {
        System.out.println("1.demo 构造器执行");
    }

    public void init() {
        System.out.println("3.demo init 方法执行");
    }

    @PostConstruct
    public void postConstruct() {
        System.out.println("2.postConstruct 执行");
    }

    @PreDestroy
    public void preDestory() {
        // Disconnected from the target VM, address: '127.0.0.1:56517', transport: 'socket'
        System.out.println("5.preDestory 执行");
    }

    public void destory() {
        System.out.println("6.destory 开始执行...");
    }
}

创建一个ServletDemoConfig

public class ServletDemoConfig {
    @Bean(name = "servletDemo", initMethod = "init", destroyMethod = "destory")
    public ServletCat servletCat() {
        return new ServletDemo();
    }
}

Main启动类


public class ServletDemoMain {
    public static void main(String[] args) {
        startServletDemoConfig();
startServletDemo();
    }
 private static void startServletDemoConfig(){
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ServletDemoConfig.class);
        System.out.println("测试...Config");
        context.close();
    }
    private static void startServletDemo(){
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ServletDemo.class);
        System.out.println("测试...");
        context.close();
    }
}

最终结果

执行方法startServletDemoConfig时,相当于把@Configuration/@Component注解放在ServletDemoConfig类上面:

1.demo 构造器执行
2.postConstruct 执行
3.demo init 方法执行
测试...Config
5.preDestory 执行
6.destory 开始执行...

执行方法startServletDemo时,相当于把@Configuration/@Component注解放在ServletDemo类上面:

1.demo 构造器执行
2.postConstruct 执行
测试...
5.preDestory 执行

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/779599.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

React Dva项目中路由跳转的方法

接下来 我们来看看路由跳转 先打开 我们Dva项目 然后我们需要在routes 下创建一个自己的路由,如果您尚未掌握在Dva项目中创建路由,可以参考我的文章 React 在Dva项目中修改路由配置,并创建一个自己的路由 然后 我的项目有两个路由 router.js…

2. Spring 的创建和使用

目录 1. 创建 Spring 项目 1.1 创建一个 maven 项目 1.2 添加 Spring 框架支持 1.3 添加启动类 2. 存储 Bean 对象 2.1 创建 Bean 2.2 将 Bean 注册到容器 3. 获取并使用 Bean 对象 3.1 创建 Spring 上下文 ApplicationContext 和 BeanFactory 的区别(重点…

《零基础入门学习Python》第054讲:论一只爬虫的自我修养2:实战

0. 请写下这一节课你学习到的内容:格式不限,回忆并复述是加强记忆的好方式! 今天我们决定在实战中来进行学习,会举两个例子,第一个例子是我们会下载一只猫,第二个例子是我们用Python来模拟浏览器通过在线的…

MySQL数据库中 IF函数的使用

文章目录 使用IF函数进行简单条件判断IF函数的应用场景总结 IF函数作为MySQL数据库中的一个函数,可以在查询语句中进行条件判断并返回不同的结果。它有多种语法形式,包括简单的IF语句和复杂的CASE语句。在本篇文章中,我们将介绍IF函数的基本用…

Android 实现仿淘宝地址多级选择器

先看下效果图 仿淘宝的选择完城市出来的选择省市区之类的,这个支持自定义层级,多少层都可以使用,接下来是代码: BottomPopUtils.class,我写了一个工具类,方便全局调用 public class BottomPopUtils {public static P…

JAVA-正则表达式基本语法规则和Pattern,Matcher,PatternSyntaxException三大类

目录 引言 一,正则表达式基本语法规则 二,正则表达式的三大类方法 2.1,Pattern类 2.1.1,Pattern的常用方法matches() 2.2,Matcher类 2.2.1,Matcher的常用方法find() 2.2.2&a…

vue3-Vite原理

1. vite的优势 1. 极速的服务启动2. 轻量快速的预加载.....2. 对vite的理解(和webpack对比说明) webpack要经过打包,然后在开发阶段启动服务器vite不需要打包 下图的"准备"就是编译的意思。 css的内容会编译程一个字符串。 组件会…

[SSM]手写Spring框架

目录 十一、手写Spring框架 第一步:创建模块myspring 第二步:准备好要管理的Bean 第三步:准备myspring.xml配置文件 第四步:核心接口实现 第五步:实例化Bean 第六步:给Bean属性赋值 第七步&#xff…

arcgis-利用等高线数据生成dem栅格

1、打开cass,展高程点,绘制三角网,绘制等高线,删除三角网和高程点。如下: 2、得到的等高线图,如下: 3、保存文件为dwg格式,随后打开arcmap软件,打开dwg的线层数据&#x…

【项目设计】基于负载均衡的在线oj平台

目录 一、项目介绍 二、开发环境以及技术 三、概要设计 四、关键算法 五、项目演示 六、代码实现 一、项目介绍 该项目是基于负载均衡的在线oj,模拟平时刷题网站(leetcode和牛客)写的一个在线判题系统 项目主要分为五个模块&#xff…

DevOps系列文章之 Git知识大全

refs和reflog Git的所有操作都基于提交:你会暂存提交,创建提交,查看过去的提交记录,或者使用很多很多Git命令在不同的仓库之间转移提交内容。这些命令中的很大一部分都会以某种形式来操作提交,其中很多还会以提交ID作…

结构型设计模式之代理模式【设计模式系列】

系列文章目录 C技能系列 Linux通信架构系列 C高性能优化编程系列 深入理解软件架构设计系列 高级C并发线程编程 设计模式系列 期待你的关注哦!!! 现在的一切都是为将来的梦想编织翅膀,让梦想在现实中展翅高飞。 Now everythi…

【iOS】对象底层学习

学习博客:[iOS]-OC对象底层探索 1. 类与对象 1.1 类和对象的本质 1.1.1 对象 对象的本质是结构体。 interface TestPerson : NSObject {// 成员变量// publicNSString *_age; // 4个字节 } property (nonatomic, copy) NSString *name; // 属性endimplementati…

C程序环境及预处理

​​​​​文章目录 一、程序的翻译环境和执行环境 1.程序编译过程 2.编译内部原理 3.执行环境 二、程序运行前的预处理 1.预定义符号归纳 2.define定义标识符 3.define定义宏 4.define替换规则 5.宏和函数的对比 三、头文件被包含的方式 四、练习:写一…

F.interpolate 数组采样操作

功能:利用插值方法,对输入的张量数组进行上\下采样操作,换句话说就是科学合理地改变数组的尺寸大小,尽量保持数据完整。 在计算机视觉中,interpolate函数常用于图像的放大(即上采样操作)。比如在细粒度识别领域中&…

【C#】MVC页面常见的重定向方式和场景

本篇文章主要简单讲讲,C# MVC 页面常见跳转或者重定向的方式和场景。 在实际项目开发中,在一些特定场景肯定会用到重定向,比如:不同角色跳转到不同视图地址 目录 一、种常见重定向方式1.1、RedirectToAction1.2、RedirectToRoute1…

猿人学14题—备而后动-勿使有变

猿人学14题—备而后动-勿使有变 抓包分析大致流程 mz参数生成m的值定位&参数组成补环境首先简单处理下十六进制编码问题提示:ReferenceError: window is not defined提示:document is not defined提示:$ is not definedASN1 is not defin…

【探索人工智能】我与讯飞星火认知大模型的对话

文章目录 讯飞星火认知大模型的地址概要讯飞星火认知大模型的发展历程讯飞星火认知大模型的主页利用讯飞星火大模型解决一些基本的数学问题讯飞星火认知大模型与OpenAI,ChatGPT没有关系!让讯飞星火认知大模型编写传奇代码hello world小结 讯飞星火认知大模型的地址 …

chatgpt使用及辅助编程方面的体验

chatgpt使用及辅助编程方面的体验 文章目录 chatgpt使用及辅助编程方面的体验1 引言2 辅助编程体验2.1 辅助编写代码2.2 找出代码问题2.3 代码优化2.4 解释代码结束语 1 引言 最近几个月什么最火,那一定时chatgpt,虽然在国内使用存在各种限制,但是还是挡…

el-select和el-checkBox实现下拉菜单全选功能

el-select 和 el-checkbox 实现下拉菜单全选功能 示例代码&#xff1a; <el-selectpopper-class"select-container"v-model"ids"placeholder"请选择目标":multiple-limit"20"multiplefilterablecollapse-tagsclass"wd400&qu…