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

news/2024/11/6 11:45:07/

执行顺序结果

/*** 服务器加载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 方法执行");}@PostConstructpublic void postConstruct() {System.out.println("2.postConstruct 执行");}@PreDestroypublic 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.ppmy.cn/news/971325.html

相关文章

产品再次跳票 法拉第未来的融资价值却渐渐浮现?

从“生态化反”到“极智科技顶奢”,贾跃亭讲故事的出众能力,总是能为旗下企业和产品赚足市场眼球。 但仅有宏大的前景描绘,似乎难以触动理性的资本市场,其创立的新能源车企法拉第未来(NASDAQ:FFIE&#xf…

互联网摸鱼日报(2023-05-04)

互联网摸鱼日报(2023-05-04) InfoQ 热门话题 7天花5万美元,我们成功复制了 Stable Diffusion,成本大降88%!训练代码已开源 百度爱番番 RT-CDP 架构实践 JEP 444:JKD 21 中出现虚拟线程,开创并…

互联网摸鱼日报(2022-12-19)

互联网摸鱼日报(2022-12-19) InfoQ 热门话题 中芯国际回应半导体万亿补贴传闻;字节跳动内部会:“去肥增瘦”人员调整将持续进行;美参议院通过禁止政府设备使用TikTok的法案 | AI一周资讯 通信行程卡正式下线&#xf…

王小川讽刺李彦宏活在平行宇宙,百度回击;字节盈利增八成,首超腾讯阿里;优酷回应非会员收看3000秒广告 | EA周报...

EA周报 2023年4月14日 每个星期1分钟,元宝带你喝一杯IT人的浓缩咖啡,了解天下事、掌握IT核心技术。 周报看点 1、优酷回应非会员收看3000秒广告:Bug已修复 2、王小川讽刺李彦宏活在平行宇宙,百度肖阳回击 3、字节跳动首度超越腾讯…

互联网摸鱼日报(2023-01-07)

互联网摸鱼日报(2023-01-07) InfoQ 热门话题 展望后端研发工程师的 2023 | InfoQ《极客有约》 2023年,这9个项目助你成为前端高手 IDC MarketScape :百度智能云位居领导者象限,预测2025年中国物联网平台支出将增至4…

元宇宙当年吹的牛,一个个都烂了尾

作者|孙鹏越 编辑|大 风 2021年底开始火热的元宇宙,还未撑过自己的“三年之痒”,便早早成为昨日黄花。 元宇宙曾是科技界最热门的话题,无论是从业人员还是网民,都将其视为计算机的未来,也许也…

云炬股市学习笔记20220118

2022年以来,股市没有迎来开门红,而且连续下跌,一度有了股灾的感觉。目前的股市行情基本上就是一种结构性行情,指数相对稳定,并没有特别大的涨跌。但个股的表现却是两级分化明显,有的个股接连上涨&#xff0…

【转载】elasticsearch 倒排索引原理

由于整型数字 integer 可以被高效压缩的特质,integer 是最适合放在 postings list 作为文档的唯一标识的,ES 会对这些存入的文档进行处理,转化成一个唯一的整型 id(这个id是document的id)。 再说下这个 id 的范围&…