Spring Boot run()方法剖析
Spring Boot自动配置部分重点介绍了相关注解,关于main中调用的run方法并没有阐述过。run方法的作用是什么呢?只有注解没有main里的run方法Spring Boot工程就好比身体个方面机能都比较好除了大脑不工作的植物人;run方法指挥各项注解有序的工作。
下面分析Spring Boot中的run方法如何指挥工作:
1、SpringApplication() 构造方法

2、run方法详解

下面以Eureka服务启动为例,详述run方法每个关键动作都发挥了什么作用。调试Eureka服务端启动:
第一步:获取并启动监听器

EventPublishingRunListener监听器是Spring容器的启动监听器,listeners.starting()开启了监听事件。那么开启监听了哪类事件呢?通过源码具体可以分析出如下结果: 
多播ApplicationStartingEvent,同时使用Consumer函数式接口处理。
在Spring Bean配置加载为BeanDefinition全过程(注解配置) - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中详述注解方式BeanIOC的过程,下面步骤基本就是bean注册的一个过程,底层基本一致。比如第五步中底层使用的就是spring中的refresh方法,可以参考五、模板方法设计模式及在Spring中的应用 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)
第二步:构造应用上下文环境
第三步:初始化应用上下文

根据应用类型创建一个AnnotationConfigServletWebServerApplicationContext容器:

第四步:刷新应用上下文前的准备阶段

第五步:刷新应用上下文


其中
,注解说明该onRefresh()的作用是在容器子类中初始化其他特别的bean,通过调试及控制台日志信息可以知道初始化了哪些特殊的bean:

相关bean最终初始化在
完成。但此时Eureka服务并没有启动,refresh还差最后异步finishRefresh(对于Eureka而言至关重要参考Eureka Server启动过程 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com))。
第六步:刷新应用上下文后的扩展接口

扩展接口,设计模式中的模板方法,默认为空实现。如果有自定义需求,可以重写该方法。比如打印一些启动结束log,或者一些其它后置处理。

未完,待续……
Spring Boot run()方法剖析的更多相关文章
- spring boot: GlobalDefaultExceptionHandler方法内的友好错误提示,全局异常捕获
spring boot: GlobalDefaultExceptionHandler方法内的友好错误提示,全局异常捕获 当你的某个控制器内的某个方法报错,基本上回显示出java错误代码,非常不友好,这 ...
- Spring Boot部署方法
Spring Boot部署方法 网上搜到的部署方法无非是打成jar包,然后shell执行nohup java调用jar命令,或者是打成war包然后部署到tomcat或者jetty容器上面. S ...
- Spring Boot 发布方法 - 原创
发布方式 构建Jar包,cmd命令行运行Spring Boot程序 第一步:在pom.xml中将packing节点值修改为jar,如下面加粗部分: <groupId>com.example ...
- Spring Boot 学习笔记 - 认识Spring Boot框架
因各种原因,.NET前端工程师重新接触JAVA,真是向全栈的路上又迈出了无奈的一步. 下面正文: Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初 ...
- Spring Boot核心配置
启动类 在包根目录下添加启动类,必须包含main方法,再添加Spring Boot启动方法: SpringApplication.run(SampleController.class, args); ...
- Spring Boot 入门详细分析
推荐阅读: 我们为什么要学习 Spring Boot 我们搭建 Spring Boot 项目,可以使用 Spring 为我们提供的初始化网站,那个可能不太方便,今天呢,我们就来说说如何使用 IDEA ...
- 3步轻松搞定Spring Boot缓存
作者:谭朝红 前言 本次内容主要介绍基于Ehcache 3.0来快速实现Spring Boot应用程序的数据缓存功能.在Spring Boot应用程序中,我们可以通过Spring Caching来快速 ...
- Spring Boot 集成 Ehcache 缓存,三步搞定!
作者:谭朝红 www.ramostear.com/articles/spring_boot_ehcache.html 本次内容主要介绍基于Ehcache 3.0来快速实现Spring Boot应用程序 ...
- 带有外部Tomcat的Spring Boot
在本文中,我将如何在外部Tomcat上运行Spring Boot应用程序.对我来说,这是一个现实的场景,我必须解决这个问题,因此也请教了一下优锐课老师,得到了很多帮助.也希望当你遇到类似问题时,能为你 ...
随机推荐
- hisql orm update表数据更新文档
更新 HiSql数据更新 HiSql 提供了好几种数据更新的方式下面一一介绍一下 如果你的表中增加了这四个字段 字段 描述 类型 CreateTime 创建时间 DateTime CreateName ...
- MicroPython 8266 配置
MicroPython 8266 配置 刷固件 下载固件 MicroPython - Python for microcontrollers 从以上网址下载固件,本文下载的是esp8266-20210 ...
- day 11 算法的时间空间复杂度
(1).有以下程序: 求输入的n值(除1和n)之外的所有因子之和. 分析:这里函数内的循环体i初值不能为零.%是表示"取余",0除以任何数都不会存在余数的,所有是余数为0. (2) ...
- dart系列之:和null说再见,null使用最佳实践
目录 简介 不需要初始化对象为null null的三元操作符 如果在使用中需要判断类型是否为空,则不要使用late 本地变量的类型提升 总结 简介 null可能是大家在编写程序中最为头疼的一个东西,稍 ...
- [SWPUCTF 2018]SimplePHP
[SWPUCTF 2018]SimplePHP 知识点 1.PHP反序列化入门之phar 2.反序列化魔术方法 __construct()//当一个对象创建时被调用 __destruct() //当一 ...
- Javascript中数组的定义和常见使用方法
一.定义数组 1.定义数组 var arry=[1,2,'小名',false] //var 数组名=[值1,值2,...] 2.设置数组长度 arry.length=10 //数组长度设置为10 二. ...
- 【刷题-LeetCode】236. Lowest Common Ancestor of a Binary Tree
Lowest Common Ancestor of a Binary Tree Given a binary tree, find the lowest common ancestor (LCA) o ...
- 网络流 HLPP 板子
#include<bits/stdc++.h> using namespace std; const int MM=4e5+5,inf=0x3f3f3f3f; int n,m,s,t,to ...
- gin中在中间件或handler中使用goroutine
package main import ( "fmt" "github.com/gin-gonic/gin" "log" "tim ...
- 流言粉碎机:JAVA使用 try catch 会严重影响性能
目录 一.JVM 异常处理逻辑 二.关于JVM的编译优化 1. 分层编译 2. 即时编译器 1. 解释模式 2. 编译模式 3. 提前编译器:jaotc 三.关于测试的约束 执行用时统计 编译器优化的 ...