Spring容器变化之SmartLifecycle,LifecycleProcesso接口详述
Spring Boot run方法启动后相应的服务也随之启动,这个操作很妙。使用者都不用关心什么服务怎么启动,不管多少个服务怎么启动只要符合Spring Boot的启动规则都可以使用其run方法同一启动。Spring Boot run()方法剖析 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)对于run方法的剖析可知其底层本质就是Spring框架中的refresh方法。通过Eureka Server启动过程 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)可知对于Eureka服务启动进行操作的事finishRefresh方法:

就是很精妙地将Eureka服务启动与Spring 容器耦合了。而耦合的契机就在于SmartLifecycle和LifecycleProcessor接口。简言之就是将Eureka服务加入到了Spring的生命周期管理,Spring管理Eureka服务的整个生命周期解放生产力了。
看看接口继承关系图:

从上图可知无论LifecycleProcessor还是SmartLifecycle都继承了Lifecycle,同时Spring容器AbstractapplicaitonContext也继承了Lifecycle即Lifecycle定义Spring容器对象的生命周期,任何spring管理对象都可以实现该接口。当ApplicationContext本身接收启动和停止信号(例如在运行时停止/重启场景)时,spring容器将在容器上下文中找出所有实现了Lifecycle及其子类接口的类,并一一调用它们实现的类。具体实现就委托给了生命周期处理器LifecycleProcessor(容器中)。
为什么有smartLifecycle接口?我们看下继承关系中的方法:

利用两个小demo看看Lifecycle:
eg1:

在案例中,main函数执行并没有主动调用start方法。
eg2:

显示调用applicationcontext中的start和stop方法,容器执行实现了Lifecycle接口的bean中的start和stop方法。
另用一个小demo看看SmartLifecycle接口:
eg3:

main函数启动时,并没有像前两个案例那样需要在main中使用applicationcontext.start和stop方法。而是根据isAutoStartUp标志自动调用start方法。
对于LifeCycle与SmartLifeCycle的区别就通过这几个案例很明显的表现出来了:

这个isAutoStartup方法不就是模板设计模式中的钩子方法么。
Spring容器变化之SmartLifecycle,LifecycleProcesso接口详述的更多相关文章
- spring4.1.8扩展实战之四:感知spring容器变化(SmartLifecycle接口)
本章是<spring4.1.8扩展实战>的第四篇,如果业务上需要在spring容器启动和关闭的时候做一些操作,可以自定义SmartLifecycle接口的实现类来扩展,本章我们通过先分析再 ...
- spring容器注入一个接口的两个实现类
spring容器中能拥有两个同种类型的bean吗?我有两个dao类同时实现一个接口,这两个接口注入时报了异常如下. org.springframework.beans.factory.NoSuchBe ...
- Spring容器中bean的生命周期以及关注spring bean对象的后置处理器:BeanPostProcessor(一个接口)
Spring IOC 容器对 Bean 的生命周期进行管理的过程: 1.通过构造器或工厂方法创建 Bean 实例 2.为 Bean 的属性设置值和对其他 Bean 的引用 3.将 Bean 实例传递给 ...
- spring4.1.8扩展实战之六:注册bean到spring容器(BeanDefinitionRegistryPostProcessor接口)
本章是<spring4.1.8扩展实战>系列的第六篇,目标是学习如何通过自己写代码的方式,向spring容器中注册bean: 原文地址:https://blog.csdn.net/boli ...
- ApplicationListener接口,在spring容器初始化后执行的方法
一.如果我们希望在Spring容器将所有的Bean都初始化完成之后,做一些操作,那么就可以使用ApplicationListener接口,实现ApplicationListener接口中的onAppl ...
- 如何手动获取Spring容器中的bean(ApplicationContextAware 接口)
ApplicationContextAware 接口的作用 先来看下Spring API 中对于 ApplicationContextAware 这个接口的描述: 即是说,当一个类实现了这个接口之 ...
- 普通Java类获取spring 容器的bean的5种方法
方法一:在初始化时保存ApplicationContext对象方法二:通过Spring提供的工具类获取ApplicationContext对象方法三:继承自抽象类ApplicationObjectSu ...
- spring 容器的基础 XmlBeanFactory
Spring容器最核心的两个类 DefaultListableBeanFactory 与 XmlBeanDefinitionReader ,XmlBeanFactory继承自DefaultLista ...
- spring容器启动的三种方式
一.在Web项目中,启动Spring容器的方式有三种,ContextLoaderListener.ContextLoadServlet.ContextLoaderPlugin. 1.1.监听器方式: ...
随机推荐
- mongodb基础整理篇————常规操作[二]
前言 简单整理一下常规操作. 正文 虽然一般说写代码看的是思想,但是呢,如果不知道mongodb 有哪些常用的操作,那么你怎么能知道mongodb是否符合你的需求,比如说如果聚合功能都没有,你得自己写 ...
- HDU分拆素数和
https://acm.hdu.edu.cn/showproblem.php?pid=2098 时间复杂度 #include<bits/stdc++.h> using namespace ...
- day23 结构体
(1).若有说明和定义: typedef int *integer: integer p,*q: 则下列叙述正确的是[C] (A).q是基类型位int的指针变量 (B).p是int型变量 (C).p是 ...
- 【C++】类-多态
类-多态 目录 类-多态 1. 基本概念 2. 运算符重载 2.1 重载为类的成员函数 2.2 重载为非成员函数 3. 虚函数 4. 抽象类 5. override与final 1. 基本概念 多态性 ...
- 【发布开源代码】铁威马NAS存储上实现的视频文件浏览
具体介绍请看:https://github.com/ahfuzhang/tnas_video_web x86机器的windows/linux/mac机器应该都能使用 效果如下: 按月浏览视频 视频太多 ...
- thingsboard源码编译启动
开发环境 不同的版本对应的开发环境不同(这里以3.3.3版本说明) jdk11+:参考jdk11+安装(win) Maven3.6+:Maven安装配置 Git:参考Git安装 IDEA: 参考IDE ...
- cp 不提示按y
yes|cp index.html.j2 yml -rf \cp index.html.j2 yml/ 两个效果是一样的
- linux面试题(重点)
1.No space left on device ,但df -h,磁盘空间还很富余?原因是 Inode 耗尽.可以使用df -i检查.磁盘中中产生了很多小的临时文件,造成在磁盘空间耗尽之前文件系统的 ...
- 不难懂-----Mock基本使用
一.mock解决的问题 开发时,后端还没完成数据输出,前端只好写静态模拟数据.数据太长了,将数据写在js文件里,完成后挨个改url.某些逻辑复杂的代码,加入或去除模拟数据时得小心翼翼.想要尽可能还原真 ...
- python基础详解
python基础部分 python基础一 python基础二 Python最详细,最深入的代码块小数据池剖析 深浅copy python文件操作 python函数部分 python函数初识 pytho ...