Spring的Lifecycle
Lifecycle接口定义了每个对象的重要方法,每个对象都有自己的生命周期需求,如下:
public interface Lifecycle { void start(); void stop(); boolean isRunning(); }
任何spring管理的对象都可以实现这个接口。那么,当ApplicationContext自身启动和停止时,它将自动调用上下文内所有生命周期的实现。通过委托给LifecycleProcessor
来做这个工作。
注意LifecycleProcessor
自身扩展了Lifecycle接口。它也增加了两个其他的方法来与上下文交互,使得可以刷新和关闭。
public interface LifecycleProcessor extends Lifecycle { void onRefresh(); void onClose(); }
启动和关闭调用的顺序是很重要的。如果两个对象之间存在依赖关系,依赖类要在其依赖类后启动,依赖类也要在其依赖类前停止。然而有时候其之间的依赖关系不是那么直接。你可能仅仅知道某种类型的对象应该在另一类型对象前启动。在那些情况下,SmartLifecycle接口定义了另一个选项,在其父类接口Phased中定义命名为getPhase()方法。
public interface Phased { int getPhase(); } public interface SmartLifecycle extends Lifecycle, Phased { boolean isAutoStartup(); void stop(Runnable callback); }
当启动时,有最低phase的对象首先启动,并且停止时,按照相反的顺序结束。因此,实现了SmartLifecycle
接口并且其
getPhase()方法返回Integer.MIN_VALUE
的一个对象将是首先被启动并且最后停止。与其相反对应的对象,Integer.MAX_VALUE的phase的值,将指明最后启动和最先停止(可能是其依赖其他对象工作运行)。当考虑phase值时,了解任何普通Lifecycle对象(没有实现SmartLifecycle其值将是0)的默认phase也很重要。因此,任何负数phase值将表示对象应该在那些标准组件前启动(并其之后停止),并且对于正数的phase值按照相反顺序启动停止。
如你在SmartLifecycle接口中定义的stop方法内有一回调参数。任何实现类在其关闭完成后必须调用回调的run方法。必须的时候由于实现了LifecycleProcessor接口的实现类可以进行异步关闭操作,DefaultLifecycleProcessor对于在每个phase调用那个回调内的对象组将等待一个超时时间。默认的每个phase的超时是30秒。你可以通过在上下文内定义一个命名为
lifecycleProcessor的bean重写默认的生命周期处理器实例。如果你仅仅想修改超时时间,如下定义将会很有用:
<bean id="lifecycleProcessor"class="org.springframework.context.support.DefaultLifecycleProcessor"> <!-- timeout value in milliseconds --> <property name="timeoutPerShutdownPhase" value="10000"/> </bean>
LifecycleProcessor
接口定义了回调方法来刷新和关闭上下文。后者仅简单地做关闭处理如同直接地调用stop方法,但是当关闭上下文时,这将起作用。刷新回调使得SmartLifecycle bean的另一个功能起作用。当上下文刷新时(在所有的对象实例化和初始化后),将调用那个回调,并且在那个点上,默认的生命周期处理器将检查每个SmartLifecycle对象的isAutoStartup()方法的返回值。如果是true,那么对象将在那个点上启动而不是等一个上下文的明确调用或者等其自己的start()方法(不像上下文的刷新,上下文启动对于标准的上下文实现不是自动发生的)phase值与依赖关系一样将如上所述决定了启动顺序。
转载于:https://www.cnblogs.com/wade-luffy/p/6074088.html
Spring的Lifecycle相关推荐
- 【Spring】Lifecycle的使用与源码分析
LifeCycle接口定义了Spring容器的生命周期,任何被Spring管理的对象都可以实现该接口.当Spring容器本身启动和停止时,会回调LifeCycle接口中定义的方法. Lifecycle ...
- Spring中SmartLifecycle和Lifecycle的作用和区别
欢迎关注方志朋的博客,回复"666"获面试宝典 本文基于SpringBoot 2.5.0-M2讲解Spring中Lifecycle和SmartLifecycle的作用和区别,以及如 ...
- Spring详解(一):简介
Spring Framework创始人:Rod Johnson. 计算机专业本科,音乐学博士.有着相当丰富的C/C++技术背景的Rod早在1996年就开始了对Java服务器端技术的研究. 轮子理论推崇 ...
- 《精通Spring 4.x 企业应用开发实战》读书笔记
Spring pdf笔记: 1.spring框架结构:数据访问和集成 web及远程操作 测试框架 AOP IOC IoC:配置方式进行bean依赖关系的描述 spEL:用 ...
- spring boot 2.5.5 reference chapter 5 生词
5 Upgrading Spring Boot check the "migration guide" on the project wiki that provides deta ...
- 聊聊微服务的服务注册与发现
聊起微服务的服务注册与发现,很多人立马就会脱口而出 zk.etcd.consul.eureka 这些组件,进而聊到 CAP 如何取舍,性能如何,高可用和容灾是怎么实现的. 引言 聊起微服务的服务注册与 ...
- Apache Arrow 简介
arrow主要focus在帮助 data 序列化, 以便在各种system之间transfer. arrorw还解决了类型共享计算格式不统一的问题,是高性能计算的基础. 背景 https://arro ...
- SpringApplication.run(MyApplication.class, args)运行流程源码分析
目录 SpringApplication.run(MyApplication.class, args);如何启动springBoot项目的 run() ConfigurableApplicationC ...
- English All Words
1.inventory n. 存货,存货清单:详细目录:财产清册Gadget inventoryWidget inventory 2.interceptor 拦截器 you may be wonder ...
最新文章
- 360浏览器5兼容模式吗_Vue-cli项目,打包生产模式,部分用户360浏览器极速模式下奔溃...
- 《拥抱变化——社交网络时代的企业转型之道》一构筑社会信任
- arthas案例:哪个controller处理了请求?每个请求的调用参数和返回值是多少?
- Linux系统下如何安装JDK?
- 《恋上数据结构第1季》二叉搜索树BST
- iMazing Mac2平台上最好的iPhone、iPad和iPod设备管理器 详细功能介绍
- 移动安全-java JEB安装使用
- 【mediasoup 带宽估计】aimd算法1 : AimdRateControl
- android inflate,Android LayoutInflater inflate() 图示详解
- 字节跳动校招开发一面、二面【凉】
- 前端通过Ajax请求从后台返回数据到页面显示,实现分页功能
- 四川大学计算机考研专业参考书目,四川大学计算机技术(专业学位)研究生考试科目和考研参考书目...
- 纯属娱乐的涂色绘画系统
- Learning to Rank 简介(转载)
- JDBC模拟SQL注入和避免SQL注入
- 关于STM32串口3的使用,接收并解析一帧数据
- 程序员接私活一定要知道的事情,我走的弯路你们都别走了
- 历史上的今天:苹果推出初代 iMac;谷歌收购摩托罗拉移动;Fuchsia 首次发布
- 因内存不足,DOC文件打不开了怎么办
- 思维导图之丰田生产的14个原则
热门文章
- 开源备份软件 oracle,oracle备份和恢复
- linux 二进制差分工具,打造Android万能的软件更新库
- 服务总线yali测试_服务器的压力测试方法与流程
- C++实现简单走迷宫的代码
- php魔术变量的概念_PHP 魔术变量和魔术函数详解
- python中列表和元组的相同点和不同点_详解Python语言中元组和列表的区别
- python自己做个定时器_技术图文:如何利用 Python 做一个简单的定时器类?
- java 异常练习题_java入门异常处理练习题问题
- 如何从使用环境上区别光纤收发器?
- 【渝粤教育】国家开放大学2018年春季 8126-21T制药工程 参考试题