spring的钩子_高级java开发必须掌握的Spring接口——SmartLifecycle

91e85a3117ae4c7681ebc8f1b9197f1b.png

有些场景我们需要在Spring 所有的bean 完成初始化后紧接着执行一些任务或者启动需要的异步服务。 常见有几种解决方案

  • j2ee 注解 启动前@PostConstruct 销毁前@PreDestroy 基于j2ee 规范
  • springboot 的 org.springframework.boot.CommandLineRunner springboot 特性前面我已经介绍过了
  • spring org.springframework.context.SmartLifecycle

这里介绍一下第三种 SmartLifecycle

SmartLifecycle 不仅仅能在初始化后执行一个逻辑,还能再关闭前执行一个逻辑,比如你一个服务在启动时向服务注册发现中心发一个信号告诉它服务上线了,下线前通知它你下线了。也就是实现了一个 从生到死 的轮回。

话不多说先实现一个SmartLifeCycle

4cffaf04b795f5dac5e4fde940a8e3a0.png

我们发现实现类需要实现3个方法,但是这3个方法并不是SmartLifecycle的方法而是

 org.springframework.context.Lifecycle

的方法:

  • void start() 我们主要在该方法中启动任务或者其他异步服务,比如开启MQ接收消息当上下文被刷新(所有对象已被实例化和初始化之后)时,将调用该方法,默认生命周期 处理器将检查每个SmartLifecycle对象的isAutoStartup()方法返回的布尔值。如果为“true”,则该方法会被调用,而不是等待显式调用自己的start()方法,同时当上下文被刷新(所有对象已被实例化和初始化之后)时,将调用该方法,默认生命周期处理器将检查每个SmartLifecycle对象的isAutoStartup()方法返回的布尔值, 如果为true,则该方法会被调用,而不是等待显式调用自己的start()方法,boolean isRunning() 的状态信号也决定此方法是否执行只有当该方法返回false start()方法才会被执行,有兴趣可以看LifecycleProcessor相关实现
  • void stop() 顾名思义 生命周期结束时调用的方法。只有当 boolean isRunning() 方法返回true 该方法才会被执行,该方法是属于Lifecyle接口的,被SmartLifeCycle作为了一个钩子 实际执行的是SmartLifeCycle中的这个方法
374f27ee59da529b18946cf1bb776770.png
  • boolean isRunning() 作为 信号来判定 start 还是stop

我们来启动一下springboot应用测试一下,下图说明 start在应用启动前执行了

7fafe3ad0d6d59d2d90a8889daed8dc6.png

然后我们写一个springmvc 接口来关闭应用,下面的关闭方法写的比较粗糙,当然有更高级的玩法。

67b3b6ae281747bda35123935b5a691a.png

我们调用 /life/destroy 方法 ,会出现下面的结果

27b6a14307709d9579e304bf912924b5.png

这里介绍它的一些使用方法和场景,先学会使用,更深层次的留给你自己去挖掘。

我是码农小胖哥,关注我的头条或者公众号,天天有干货。有问题可以留言或者私信,觉得写的不错可以点个赞,转发一下。

bd470087b16116b89e15ec5855808474.gif

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

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

相关文章

大型网站架构系列:负载均衡详解(4)

本文是负载均衡详解的第四篇,主要介绍了LVS的三种请求转发模式和八种负载均衡算法,以及Haproxy的特点和负载均衡算法。具体参考文章,详见最后的链接。 三、LVS负载均衡 LVS是一个开源的软件,由毕业于国防科技大学的章文嵩博士于19…

关于JavaFX的最常见问题

上周,我在斯德哥尔摩的Jfokus 2012上做了一个关于JavaFX的演讲,当时我意识到每次活动都会问三个问题。 似乎有一个普遍的兴趣,所以我尝试在这篇文章中回答他们(尽可能的说实话): iPad或其他移动设备上的Jav…

Linux GRUB 引导Win 7 ---- error: invalid EFI file path

最近新买了个固态硬盘,先装了个Win 7系统,现在装的系统和以前装系统唯一的区别是引导不是以前的MBR,而是最新看似是个趋势的GPTUEFI方式。 win 7 装完啦,还是和以往的一样装 Ubantu (Ubantu 12.04),ubantu 引导磁盘扇…

使用Spring AOP实现活动记录模式

在班级设计中,我们应就每个班级的职责分配做出决定。 如果我们选择的不错,系统将更易于理解,维护和扩展。 几乎我们所有的项目都有一个持久层,即关系数据库,文档存储或仅XML文件。 通常,您将使用DAO模式在业…

php socketconnect连接失败_PHP设计模式之模板方法模式

模板方法模式,也是我们经常会在不经意间有会用到的模式之一。这个模式是对继承的最好诠释。当子类中有重复的动作时,将他们提取出来,放在父类中进行统一的处理,这就是模板方法模式的最简单通俗的解释。就像我们平时做项目&#xf…

数据库建表练习(10.11作业)

转载于:https://www.cnblogs.com/HRZJ/p/5951897.html

从程序员到CTO的Java技术路线图

时间:2013-05-29 17:39来源:www.chengxuyuans.com在技术方面无论我们怎么学习,总感觉需要提升自已不知道自己处于什么水平了。但如果有清晰的指示图供参考还是非常不错的,这样我们清楚的知道我们大概处于那个阶段和水平。 Java程序员 高级特性 反射、泛型…

设置Spring 3开发环境

本教程简要说明了如何设置典型的环境来开发基于Spring的应用程序。 除了可以正常工作的Windows XP客户端具有足够的CPU能力和内存外,本教程没有其他先决条件。 在教程中,我们将需要安装以下组件: Java 6 JDK更新26 用于Java EE开发人员的Ecl…

js中window.onload 与 jquery中$(document.ready()) 测试

js中window.onload 与 jquery中$(document.ready())区别&#xff0c;验证代码如下(调换js代码和Jquer代码书写顺序测试&#xff0c;运行结果一样&#xff0c;因此与代码书写位置没关系)&#xff1a;<html> <head> <script typetext/javascript srcjquery-1.11.1…

Java中的定制国际化(i18n)

国际化&#xff08;i18n&#xff09;在我们的软件项目中非常重要。 它主要带来以下好处&#xff1a; 将UI字符串外部化为除代码文件之外的外部文件&#xff0c;以及易于管理的UI内容。 支持多种语言。 在这篇文章中&#xff0c;将为Eclipse和Java项目提供一个简短的i18n实际示…

SEO 百度后台主动推送链接

实践步骤&#xff0c;先用爬虫程序将本网站的所有连接爬取出来&#xff0c;再用python文件处理程序把爬虫来的东东整理成一行一个链接的文本格式。再用postman接口测试工具&#xff0c;使用post方式&#xff0c;将所有的链接post过去&#xff0c;这样主动推送是最为快速的提交方…

nyoj--127--星际之门(一)(生成树的数量)

星际之门&#xff08;一&#xff09; 时间限制&#xff1a;3000 ms | 内存限制&#xff1a;65535 KB难度&#xff1a;3描述公元3000年&#xff0c;子虚帝国统领着N个星系&#xff0c;原先它们是靠近光束飞船来进行旅行的&#xff0c;近来&#xff0c;X博士发明了星际之门&…

Oracle 常用的一些函数

字符函数 SELECT UPPER(hello WORLD) FROM DUAL; //将小写字母变为大写字母SELECT LOWER(hello WORLD) FROM DUAL; //将大写字母变为小心字母SELECT INITCAP(hello WORLD) FROM DUAL; //将字符串的首字母大写SELECT CONCAT(hello, world) FROM DUAL; //字符串拼…

JavaScript 学习随记——==和===及常见元素的真假值

“” 和 “” 符合的使用 <script>/*** 表示可以经过自动转换&#xff0c;比较的是数值*///example01if(1 true && false 0 && true 1){console.log(1true);console.log(" 比较的是等号两边数据的值是否相等&#xff08;可以经过自动转换&#…

JavaScript学习随记——数组一

数组的创建及length属性 <script type"text/javascript" charset"utf-8">// 数组创建方式一,此种方式写的时候比较麻烦var arrnew Array();// 数组创建方式二var arr [1,2,3,4,true,str,new Date()];console.log("arr.length&#xff1a;"…

Spring和石英:多作业计划服务

作业调度对于应用程序来说是如此重要。 尤其是在大型项目中&#xff0c;处理大量工作可能是一个问题。 Spring和Quartz为解决该问题带来了巨大的好处。 本文介绍了如何通过使用Spring和Quartz轻松地计划多个作业。 二手技术&#xff1a; JDK 1.6.0_21 春天3.1.1 石英1.8.5 M…

反射的简单应用

首先有一个类 1 using System;2 using System.Collections.Generic;3 using System.Linq;4 using System.Text;5 using System.Threading.Tasks;6 7 namespace ConsoleApplication18 {9 public class demo 10 { 11 public string name "程序员"; 12…

JavaFX 2.0示例介绍书

我最近完成了有关JavaFX 2.0 SDK新版本的书的编写&#xff0c;并且已经将它放在您附近的书店&#xff08; Amazon &#xff09;的书架上。 该书将逐步指导您完成JavaFX 2.0的来龙去脉。 当您遇到一章时&#xff0c;将看到一些菜谱&#xff0c;这些菜谱将带来一个问题&#xff0…

双纵坐标的绘图命令_工程师绘图必备软件——OriginLab 2019b

点击右上角关注&#xff0c;尽享后续精品软件OriginLab 2019b是OriginLab OriginPro 2019版本的加强版&#xff0c;这个软件对于许多人来讲并不陌生&#xff0c;可以说是科学家和工程师的绘图必备软件。新的版本也带来许多改变&#xff0c;软件拥有多种功能&#xff0c;这个版本…

Spring远程支持和开发RMI服务

Spring远程支持简化了启用远程服务的开发。 当前&#xff0c;Spring支持以下远程技术&#xff1a;远程方法调用&#xff08;RMI&#xff09;&#xff0c;HTTP调用程序&#xff0c;Hessian&#xff0c;Burlap&#xff0c;JAX-RPC&#xff0c;JAX-WS和JMS。 远程方法调用&#xf…