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值与依赖关系一样将如上所述决定了启动顺序。
Spring的Lifecycle的更多相关文章
- Spring Framework 官方文档学习(二)之IoC容器与bean lifecycle
到目前为止,已经看了一百页.再次感慨下,如果想使用Spring,那可以看视频或者找例子,但如果想深入理解Spring,最好还是看官方文档. 原计划是把一些基本接口的功能.层次以及彼此的关系罗列一下.同 ...
- Spring依赖注入 --- 简单使用说明
Spring依赖注入 --- 简单使用说明 本文将对spring依赖注入的使用做简单的说明,enjoy your time! 1.使用Spring提供的依赖注入 对spring依赖注入的实现方法感兴趣 ...
- Spring之bean二生命周期
上一博客主要学习了下bean的配置.注入.自定义属性编辑器,今天来熟悉bean的生命周期.在开发中生命周期是一个很常见的名词,基本每种编程语言都能找到与它关联的.关于bean的生命周期我在网上也找了好 ...
- Spring MVC -- Spring框架入门(IoC和DI)
Spring MVC是Spring框架中用于Web应用开发的一个模块.Spring MVC的MVC是Model-View-Controller的缩写.它是一个广泛应用于图像化用户交互开发中的设计模式, ...
- spring线程池(同步、异步)
一.spring异步线程池类图 二.简单介绍 2.1. TaskExecutor---Spring异步线程池的接口类,其实质是java.util.concurrent.Executor 以下是官方已经 ...
- Spring源码学习之IOC实现原理(二)-ApplicationContext
一.Spring核心组件结构 总的来说Spring共有三个核心组件,分别为Core,Context,Bean.三大核心组件的协同工作主要表现在 :Bean是包装我们应用程序自定义对象Object的,O ...
- Spring源码解析-IOC容器的实现-ApplicationContext
上面我们已经知道了IOC的建立的基本步骤了,我们就可以用编码的方式和IOC容器进行建立过程了.其实Spring已经为我们提供了很多实现,想必上面的简单扩展,如XMLBeanFacroty等.我们一般是 ...
- 【Spring实战】----开篇(包含系列目录链接)
[Spring实战]----开篇(包含系列目录链接) 置顶2016年11月10日 11:12:56 阅读数:3617 终于还是要对Spring进行解剖,接下来Spring实战篇系列会以应用了Sprin ...
- 十、Spring之BeanFactory源码分析(二)
Spring之BeanFactory源码分析(二) 前言 在前面我们简单的分析了BeanFactory的结构,ListableBeanFactory,HierarchicalBeanFactory,A ...
随机推荐
- win7 ubuntu10.04双系统,重装win7后,修复双启动项
进入ubuntu的liveCD(即在试用ubuntu里),在终端里操作 首先要找到自己的ubuntu系统挂载在那个sda下面.可以用sudo fdisk -l 这个命令.然后: 1. sudo -i ...
- ubuntu下安装mysql
现在的软件越来越好安装,尤其是在ubuntu下安装软件,更是没有技巧,只需要在联网的情况下使用apt-get inatll 即可.在决定安装mysql之前,要先确定系统是否已经安装mysql.如下图: ...
- 【xml】利用OpenCV解析
看到一篇讲的很清楚的博客:http://blog.csdn.net/jarvischu/article/details/8481510
- HDU 5996 dingyeye loves stone ---BestCoder Round #90
题目链接 设根节点的深度为0,将所有深度为奇数的节点的石子数目xor起来,则先手必胜当且仅当这个xor和不为0. 证明同阶梯博弈.对于偶深度的点上的石子,若对手移动它们,则可模仿操作:对于奇深度上的石 ...
- osgearth使用prjected投影
In projected mode, you have to specify a map profile (i.e. a map projection). You also need to tell ...
- 群内大神与你交流WEB经验 业内专家指点就职技巧
就知道你是一个有理想要抱负的人,不会满足于做一个初级的前端开发工程师.在接下来的这个阶段,我们将走上前端开发的进阶之路,将自己的能力再往上拔高一个等级.同样,薪资也会往上升一个等级!但是,如果你是一个 ...
- 解决At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this log
pom增加:<dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</art ...
- 在Eclipse中创建Maven多模块工程的例子
.配置eclipse的maven .在Eclipse里面New -> Maven Project -> 选择“Create a simple project” Group Id: com. ...
- 转载_虚拟机下LInux(终端)配置网络的方法
出自: http://www.360doc.com/content/14/1027/11/17496895_420258403.shtml 对文章的重点进行剪贴,方便查看. 这几天在虚拟机vmware ...
- 与你相遇好幸运,async解决循环回调问题
由于使用的sailsjs框架,用的是sailsjs自身带的ORm(就是waterline),ORM的默认数据库的返回值在回调里面. > arg是一个数组 count用来计数用 tmpArr临时存 ...