spring lifeCycle
Lifecycle接口定义了每个对象的生命周期。如下
public interface Lifecycle {
void start();
void stop();
boolean isRunning();
}
启动和关闭调用的顺序是很重要的。如果两个对象之间存在依赖关系,依赖类要在其依赖类后启动,依赖类也要在其依赖类前停止。然而有时候其之间的依赖关系不是那么直接。你可能仅仅知道某种类型的对象应该在另一类型对象前启动。在那些情况下,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源码分析之freemarker整合
FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页.电子邮件.配置文件.源代码等)的通用工具. 它不是面向最终用户的,而是一个Java类库,是一款程 ...
- spring bean生命周期管理--转
Life Cycle Management of a Spring Bean 原文地址:http://javabeat.net/life-cycle-management-of-a-spring-be ...
- 译:Spring框架参考文档之IoC容器(未完成)
6. IoC容器 6.1 Spring IoC容器和bean介绍 这一章节介绍了Spring框架的控制反转(IoC)实现的原理.IoC也被称作依赖注入(DI).It is a process wher ...
- 【转】Spring websocket 使用
http://docs.spring.io/spring/docs/current/spring-framework-reference/html/websocket.html https://spr ...
- spring mvc DispatcherServlet详解之三---request通过ModelAndView中获取View实例的过程
整个spring mvc的架构如下图所示: 上篇文件讲解了DispatcherServlet第二步:通过request从Controller获取ModelAndView.现在来讲解第三步:reques ...
- Configure swagger with spring boot
If you haven’t starting working with spring boot yet, you will quickly find that it pulls out all th ...
- Spring Boot 启动加载数据 CommandLineRunner
实际应用中,我们会有在项目服务启动的时候就去加载一些数据或做一些事情这样的需求. 为了解决这样的问题,Spring Boot 为我们提供了一个方法,通过实现接口 CommandLineRunner 来 ...
- Spring Boot特性(转)
摘要: 1. SpringApplication SpringApplication 类是启动 Spring Boot 应用的入口类,你可以创建一个包含 main() 方法的类,来运行 SpringA ...
- Spring Bean 生命周期
转自:也谈Spring Bean的生命周期 开篇先用一张老图描述下Spring中Bean容器的生命周期. 插叙一下,记得某个博文中提到:“Spring的Bean容器只管理非单例Bean的生命周期,单例 ...
随机推荐
- POJ:2777-Count Color(线段树+状压)
Count Color Time Limit: 1000MS Memory Limit: 65536K Description Chosen Problem Solving and Program d ...
- C语言指针分析
/*************1*************/ int p; //p是一个普通的整型变量. /*************2*************/ int *p; //p与*结合,说明 ...
- Root CA certificate:ApacheJMeterTemporaryRootCA.crt created in JMeter bin directory
今天学习jmeter录制,在点击start之后弹出: 且在jmeter安装目录里确实生成了ApacheJMeterTemporaryRootCA.crt文件 上网查询官方文档http://120.52 ...
- jenkins匿名用户登录 - 安全设置
最近自己安装配置jenkins,但是跑任务时,发现是匿名账户登录,且提示: 后来发现搭建好jenkins之后,默认就是匿名用户登录的,可以在安装设置菜单里进行账户管理. 1.登录Jenkins服务器, ...
- meta-data
<meta-data android:name="string" android:resource="resource specification" ...
- java事物
[引用:http://www.cnblogs.com/kristain/articles/2038397.html] 一.什么是事务 事务是访问数据库的一个操作序列,数据库应用系统通过事务集来完成对数 ...
- angularjs报错问题记录
1.[$injector:unpr]:没有找到注入的东西 2.$compile:multidir:多指令编译错误. 3.[ng:areq]:重复定义了ng-controller. 4 ...
- 到底有没有必要兼容IE版本
我就说两个字:"没有". 理由如下: 1.占资源空间,额外去写css hack去做页面兼容处理.(主要是增加css代码) PS:css hack 不是W3C的规范,css hack ...
- python - 自动化测试框架 - logger
# -*- coding:utf-8 -*- '''@project: Voctest@author: Jimmy@file: log.py@ide: PyCharm Community Editio ...
- 如何理解logistic函数?
作者:煎挠橙链接:https://www.zhihu.com/question/36714044/answer/78680948来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明 ...