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相关推荐

  1. Spring中SmartLifecycle和Lifecycle的作用和区别

    欢迎关注方志朋的博客,回复"666"获面试宝典 本文基于SpringBoot 2.5.0-M2讲解Spring中Lifecycle和SmartLifecycle的作用和区别,以及如 ...

  2. Spring 中的 context

    Spring 中的 context BeanFactory 首先看下,官方在代码中给出的注释: The root interface for accessing a Spring bean conta ...

  3. 深究Spring中Bean的生命周期

    前言 这其实是一道面试题,是我在面试百度的时候被问到的,当时没有答出来(因为自己真的很菜),后来在网上寻找答案,看到也是一头雾水,直到看到了<Spring in action>这本书,书上 ...

  4. java快速注释怎么配置_详解如何在低版本的Spring中快速实现类似自动配置的功能...

    在 Spring 4 后才引入了 @Conditional 等条件注解,它是 Spring Boot 中实现自动配置的最大功臣! 那么问题来了:如果我们还在使用 Spring 3.x 的老版本,这时候 ...

  5. Spring中Bean的生命周期以及三级缓存介绍

    Bean的生命周期以及三级缓存介绍 简述 测试代码编写 创建IOC容器(Bean创建) 1.refresh()方法 2.finishBeanFactoryInitialization(beanFact ...

  6. Spring中bean的执行初始化和销毁方法的4种方式详解

    一.引入 在java的实际开发过程中,我们可能需要在spring实例化一个bean的过程中,使用到初始化一个对象(bean)后立即初始化(加载)一些数据,或者在销毁一个对象之前进行执行一些事情等等. ...

  7. Spring中配置DataSource数据源的几种选择

    Spring中配置DataSource数据源的几种选择 在Spring框架中有如下3种获得DataSource对象的方法: 从JNDI获得DataSource. 从第三方的连接池获得DataSourc ...

  8. 详解设计模式在Spring中的应用

    设计模式作为工作学习中的枕边书,却时常处于勤说不用的尴尬境地,也不是我们时常忘记,只是一直没有记忆. 今天,螃蟹在IT学习者网站就设计模式的内在价值做一番探讨,并以spring为例进行讲解,只有领略了 ...

  9. Spring中利用applicationContext.xml文件实例化对象和调用方法

    Spring中实例化对象和调用方法入门 1.jar包和xml的准备 已上传至百度云盘,链接: https://pan.baidu.com/s/1CY0xQq3GLK06iX7tVLnp3Q 提取码: ...

最新文章

  1. linux创建redis容器,docker-compose实现redis部署及键值添加
  2. half extents
  3. 【机器学习】HOG detectMultiScale 参数分析
  4. 引号(反引号、$()符号)
  5. 数据结构之自建算法库——链栈
  6. java学习(146):file常用方法3
  7. 无标题栏窗口的实现拖动,和边的拉伸功能
  8. 前端vue后端java,Vue调用后端java接口的实例代码_亦心_前端开发者
  9. php编写六十甲子纳音表_六十甲子纳音表详细说明,看看你属于什么命,属于那个颜色...
  10. macbook linux 双系统,MacBook Air 安装 Ubuntu 双系统
  11. Cisco Packet Tracer7.1 rip协议实验
  12. 详解 TypyScript 的一个怪异行为
  13. [深度学习]反向传播的微分原理
  14. 单源最短路(spfa+Dijkstra)附数据
  15. 十大排序算法——选择排序法
  16. 微型计算机原理与接口周荷琴,微型计算机原理与接口技术周荷琴
  17. shell 脚本实例--持续更新
  18. C盘爆满?简单几招教你释放、清理C盘几十G空间,最有效的C盘清理方法
  19. 7-7 浪漫的表白 (10 分) 计算生日差据天数
  20. 013:Django商城项目规划与环境搭建

热门文章

  1. U8 EAI实现XML的生成
  2. python对新媒体运营的帮助_一年新媒体工作积累的经验
  3. 俄罗斯“扎克伯格”:创建区块链版“微信” 27岁身价已达2.5亿美元
  4. 2022年值得购买的拍照手机推荐 这五款出片率极强
  5. php5.5.30 redis dll,php_redis.dll,下载,简介,描述,修复,等相关问题一站搞定_DLL之家
  6. 胡伟立-孤独[影视配乐扒曲]
  7. 攻防世界illusion暴力破解
  8. 大话 Oracle Grid 云时代的RAC
  9. 2023年天津市逆向re2.exe解析-比较难(超详细)
  10. [导入]在水一方的个人网站