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接口详述的更多相关文章

  1. spring4.1.8扩展实战之四:感知spring容器变化(SmartLifecycle接口)

    本章是<spring4.1.8扩展实战>的第四篇,如果业务上需要在spring容器启动和关闭的时候做一些操作,可以自定义SmartLifecycle接口的实现类来扩展,本章我们通过先分析再 ...

  2. spring容器注入一个接口的两个实现类

    spring容器中能拥有两个同种类型的bean吗?我有两个dao类同时实现一个接口,这两个接口注入时报了异常如下. org.springframework.beans.factory.NoSuchBe ...

  3. Spring容器中bean的生命周期以及关注spring bean对象的后置处理器:BeanPostProcessor(一个接口)

    Spring IOC 容器对 Bean 的生命周期进行管理的过程: 1.通过构造器或工厂方法创建 Bean 实例 2.为 Bean 的属性设置值和对其他 Bean 的引用 3.将 Bean 实例传递给 ...

  4. spring4.1.8扩展实战之六:注册bean到spring容器(BeanDefinitionRegistryPostProcessor接口)

    本章是<spring4.1.8扩展实战>系列的第六篇,目标是学习如何通过自己写代码的方式,向spring容器中注册bean: 原文地址:https://blog.csdn.net/boli ...

  5. ApplicationListener接口,在spring容器初始化后执行的方法

    一.如果我们希望在Spring容器将所有的Bean都初始化完成之后,做一些操作,那么就可以使用ApplicationListener接口,实现ApplicationListener接口中的onAppl ...

  6. 如何手动获取Spring容器中的bean(ApplicationContextAware 接口)

    ApplicationContextAware 接口的作用 先来看下Spring API 中对于 ApplicationContextAware 这个接口的描述:   即是说,当一个类实现了这个接口之 ...

  7. 普通Java类获取spring 容器的bean的5种方法

    方法一:在初始化时保存ApplicationContext对象方法二:通过Spring提供的工具类获取ApplicationContext对象方法三:继承自抽象类ApplicationObjectSu ...

  8. spring 容器的基础 XmlBeanFactory

    Spring容器最核心的两个类 DefaultListableBeanFactory  与 XmlBeanDefinitionReader ,XmlBeanFactory继承自DefaultLista ...

  9. spring容器启动的三种方式

    一.在Web项目中,启动Spring容器的方式有三种,ContextLoaderListener.ContextLoadServlet.ContextLoaderPlugin. 1.1.监听器方式: ...

随机推荐

  1. IK 分词器

    目录 IK 分词器-介绍 IK 分词器-安装 环境准备:Maven 安装 IK 分词器 IK 分词器-使用 IK 分词器-介绍 现有问题:ES 默认对中文分词并不友好,实际上是把中文进行了每个字的分词 ...

  2. js数组清空的两种方式

    编辑器加载中...方式1,length赋值为0 这种方式很有意思, 其它语言如Java,其数组的length是只读的,不能被赋值.如 int[] ary = {1,2,3,4}; ary.length ...

  3. Mybatis配置解析(核心配置文件)

    4.配置解析 4.1.核心配置文件 Mybatis的配置文件包含了会深深影响mybatis行为的设置和属性信息 mybatis-config.xml properties(属性)重点 settings ...

  4. 洛谷 CF196A 题解

    题目传送门 题目描述: 读入字符串,求该串的最大字典序子序列. 我的思路: 循环判断只要当前字符比后面所有的字符的字典序大,就把这个字符存到另一个字符串中,最后和输入的字符串循环比较如果该字符和输入时 ...

  5. 神坑!为什么prometheus的pushgateway不能对上报的counter进行累加?

    部署了一个prometheus的pushgateway,然后两次对其发送counter类型的数据: #第一次发送 curl -X POST -d '# TYPE my_first_metric_ahf ...

  6. Cesium源码剖析---Clipping Plane

    之前就一直有写博客的想法,别人也建议写一写,但一直没有动手写,自己想了一下原因,就一个字:懒.懒.懒.为了改掉这个毛病,决定从今天开始写博客了,一方面对自己掌握的知识做一个梳理,另一方面和大家做一个交 ...

  7. synergy最佳解决方案——barrier

    synergy最佳解决方案--barrier ​ 不知道大家有没有一套键盘鼠标控制多台电脑的需求,主流的硬件或说软件有大神整理如下: 软件方案: Windows 之间:Mouse Without Bo ...

  8. 什么是XSS攻击?什么是SQL注入攻击?什么是CSRF攻击?

    1. XSS(Cross Site Script,跨站脚本攻击) 是向网页中注入恶意脚本在用户浏览网页时在用户浏览器中执行恶意脚本的攻击方式. 1.1跨站脚本攻击分有两种形式: 反射型攻击(诱使用户点 ...

  9. vue学习12-表单属性绑定

    1 <!DOCTYPE html> 2 <html lang='en'> 3 <head> 4 <meta charset='UTF-8'> 5 < ...

  10. vue学习9-更新视图

    <!DOCTYPE html> <html lang='en'> <head>  <meta charset='UTF-8'>  <meta ht ...