spring中的Lifecycle
spring中的Lifecycle
Lifecycle介绍
Lifecycle
是spring中的生命循环接口,实现该接口的类将会可以启动,关闭。在AbstractApplicationContext
通过ConfigurableApplicationContext
接口中就实现了Lifecycle
,当上下文调用start()
函数时,就会去BeanFactory中找实现了Lifecycle
接口的Bean,并调用该bean的start()
函数。
AbstractApplicationContext源码分析
初始化LifecycleProcessor
AbstractApplicationContext
中有方法initLifecycleProcessor()
,用来初始化生命周期执行器,用以执行容器中所有实现了Lifecycle
接口的bean。
/*** Initialize the LifecycleProcessor.* Uses DefaultLifecycleProcessor if none defined in the context.* @see org.springframework.context.support.DefaultLifecycleProcessor*/
protected void initLifecycleProcessor() {ConfigurableListableBeanFactory beanFactory = getBeanFactory();//参试在容器中获取LifecycleProcessorif (beanFactory.containsLocalBean(LIFECYCLE_PROCESSOR_BEAN_NAME)) {this.lifecycleProcessor =beanFactory.getBean(LIFECYCLE_PROCESSOR_BEAN_NAME, LifecycleProcessor.class);if (logger.isTraceEnabled()) {logger.trace("Using LifecycleProcessor [" + this.lifecycleProcessor + "]");}}else {//容器没有则使用DefaultLifecycleProcessorDefaultLifecycleProcessor defaultProcessor = new DefaultLifecycleProcessor();//设置BeanFactory,因为要对BeanFactory里面的Lifecycle bean调用start,stopdefaultProcessor.setBeanFactory(beanFactory);this.lifecycleProcessor = defaultProcessor;//注册到容器中beanFactory.registerSingleton(LIFECYCLE_PROCESSOR_BEAN_NAME, this.lifecycleProcessor);if (logger.isTraceEnabled()) {logger.trace("No '" + LIFECYCLE_PROCESSOR_BEAN_NAME + "' bean, using " +"[" + this.lifecycleProcessor.getClass().getSimpleName() + "]");}}
}
start()和stop()
AbstractApplicationContext
中的start()和stop()
方法用来启动生命周期。通过LifecycleProcessor
来去启动BeanFactory
中的实现了Lifecycle
接口的bean。
//---------------------------------------------------------------------
// Implementation of Lifecycle interface
//---------------------------------------------------------------------@Override
public void start() {getLifecycleProcessor().start();publishEvent(new ContextStartedEvent(this));
}@Override
public void stop() {getLifecycleProcessor().stop();publishEvent(new ContextStoppedEvent(this));
}
DefaultLifecycleProcessor源码分析
start()和startBeans()
DefaultLifecycleProcessor
通过从BeanFactory
中获取LifecycleBean
,并调用它们的start()
方法
@Override
public void start() {startBeans(false);this.running = true;
}// Internal helpersprivate void startBeans(boolean autoStartupOnly) {//这里是从BeanFactory中获取所有LifecycleBeanMap<String, Lifecycle> lifecycleBeans = getLifecycleBeans();Map<Integer, LifecycleGroup> phases = new HashMap<>();lifecycleBeans.forEach((beanName, bean) -> {if (!autoStartupOnly || (bean instanceof SmartLifecycle && ((SmartLifecycle) bean).isAutoStartup())) {int phase = getPhase(bean);LifecycleGroup group = phases.get(phase);if (group == null) {group = new LifecycleGroup(phase, this.timeoutPerShutdownPhase, lifecycleBeans, autoStartupOnly);phases.put(phase, group);}group.add(beanName, bean);}});if (!phases.isEmpty()) {List<Integer> keys = new ArrayList<>(phases.keySet());Collections.sort(keys);for (Integer key : keys) {//最后会调用该bean的start()方法phases.get(key).start();}}
}
Lifecycle Bean使用示例
MyLifecycleBean
/*** @author liangwy * @since 2022-5-17*/
public class MyLifecycleBean implements Lifecycle {private Boolean flag = false;@Overridepublic void start() {this.flag = true;System.out.println("启动MyLifecycleBean");}@Overridepublic void stop() {this.flag = false;System.out.println("关闭MyLifecycleBean");}@Overridepublic boolean isRunning() {return flag;}
}
测试
public static void main(String[] args) {AnnotationConfigApplicationContext applicationContext = runAnnotationConfigApplicationContext();applicationContext.start();MyLifecycleBean myLifecycleBean = applicationContext.getBean("myLifecycleBean", MyLifecycleBean.class);System.out.println(myLifecycleBean.isRunning());applicationContext.stop();System.out.println(myLifecycleBean.isRunning());
}/*** 注解配置方式创建上下文* @return*/
public static AnnotationConfigApplicationContext runAnnotationConfigApplicationContext(){AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(ApplicationMain.class);applicationContext.getBeanFactory().registerCustomEditor(Date.class,TestPropertyEditorSupport.class);return applicationContext;
}
结果打印
启动MyLifecycleBean
true
关闭MyLifecycleBean
false
spring中的Lifecycle相关推荐
- Spring中SmartLifecycle和Lifecycle的作用和区别
欢迎关注方志朋的博客,回复"666"获面试宝典 本文基于SpringBoot 2.5.0-M2讲解Spring中Lifecycle和SmartLifecycle的作用和区别,以及如 ...
- Spring 中的 context
Spring 中的 context BeanFactory 首先看下,官方在代码中给出的注释: The root interface for accessing a Spring bean conta ...
- 深究Spring中Bean的生命周期
前言 这其实是一道面试题,是我在面试百度的时候被问到的,当时没有答出来(因为自己真的很菜),后来在网上寻找答案,看到也是一头雾水,直到看到了<Spring in action>这本书,书上 ...
- java快速注释怎么配置_详解如何在低版本的Spring中快速实现类似自动配置的功能...
在 Spring 4 后才引入了 @Conditional 等条件注解,它是 Spring Boot 中实现自动配置的最大功臣! 那么问题来了:如果我们还在使用 Spring 3.x 的老版本,这时候 ...
- Spring中Bean的生命周期以及三级缓存介绍
Bean的生命周期以及三级缓存介绍 简述 测试代码编写 创建IOC容器(Bean创建) 1.refresh()方法 2.finishBeanFactoryInitialization(beanFact ...
- Spring中bean的执行初始化和销毁方法的4种方式详解
一.引入 在java的实际开发过程中,我们可能需要在spring实例化一个bean的过程中,使用到初始化一个对象(bean)后立即初始化(加载)一些数据,或者在销毁一个对象之前进行执行一些事情等等. ...
- Spring中配置DataSource数据源的几种选择
Spring中配置DataSource数据源的几种选择 在Spring框架中有如下3种获得DataSource对象的方法: 从JNDI获得DataSource. 从第三方的连接池获得DataSourc ...
- 详解设计模式在Spring中的应用
设计模式作为工作学习中的枕边书,却时常处于勤说不用的尴尬境地,也不是我们时常忘记,只是一直没有记忆. 今天,螃蟹在IT学习者网站就设计模式的内在价值做一番探讨,并以spring为例进行讲解,只有领略了 ...
- Spring中利用applicationContext.xml文件实例化对象和调用方法
Spring中实例化对象和调用方法入门 1.jar包和xml的准备 已上传至百度云盘,链接: https://pan.baidu.com/s/1CY0xQq3GLK06iX7tVLnp3Q 提取码: ...
最新文章
- linux创建redis容器,docker-compose实现redis部署及键值添加
- half extents
- 【机器学习】HOG detectMultiScale 参数分析
- 引号(反引号、$()符号)
- 数据结构之自建算法库——链栈
- java学习(146):file常用方法3
- 无标题栏窗口的实现拖动,和边的拉伸功能
- 前端vue后端java,Vue调用后端java接口的实例代码_亦心_前端开发者
- php编写六十甲子纳音表_六十甲子纳音表详细说明,看看你属于什么命,属于那个颜色...
- macbook linux 双系统,MacBook Air 安装 Ubuntu 双系统
- Cisco Packet Tracer7.1 rip协议实验
- 详解 TypyScript 的一个怪异行为
- [深度学习]反向传播的微分原理
- 单源最短路(spfa+Dijkstra)附数据
- 十大排序算法——选择排序法
- 微型计算机原理与接口周荷琴,微型计算机原理与接口技术周荷琴
- shell 脚本实例--持续更新
- C盘爆满?简单几招教你释放、清理C盘几十G空间,最有效的C盘清理方法
- 7-7 浪漫的表白 (10 分) 计算生日差据天数
- 013:Django商城项目规划与环境搭建
热门文章
- U8 EAI实现XML的生成
- python对新媒体运营的帮助_一年新媒体工作积累的经验
- 俄罗斯“扎克伯格”:创建区块链版“微信” 27岁身价已达2.5亿美元
- 2022年值得购买的拍照手机推荐 这五款出片率极强
- php5.5.30 redis dll,php_redis.dll,下载,简介,描述,修复,等相关问题一站搞定_DLL之家
- 胡伟立-孤独[影视配乐扒曲]
- 攻防世界illusion暴力破解
- 大话 Oracle Grid 云时代的RAC
- 2023年天津市逆向re2.exe解析-比较难(超详细)
- [导入]在水一方的个人网站