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()方法剖析的更多相关文章

  1. spring boot: GlobalDefaultExceptionHandler方法内的友好错误提示,全局异常捕获

    spring boot: GlobalDefaultExceptionHandler方法内的友好错误提示,全局异常捕获 当你的某个控制器内的某个方法报错,基本上回显示出java错误代码,非常不友好,这 ...

  2. Spring Boot部署方法

    Spring Boot部署方法     网上搜到的部署方法无非是打成jar包,然后shell执行nohup java调用jar命令,或者是打成war包然后部署到tomcat或者jetty容器上面. S ...

  3. Spring Boot 发布方法 - 原创

    发布方式 构建Jar包,cmd命令行运行Spring Boot程序 第一步:在pom.xml中将packing节点值修改为jar,如下面加粗部分: <groupId>com.example ...

  4. Spring Boot 学习笔记 - 认识Spring Boot框架

    因各种原因,.NET前端工程师重新接触JAVA,真是向全栈的路上又迈出了无奈的一步. 下面正文: Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初 ...

  5. Spring Boot核心配置

    启动类 在包根目录下添加启动类,必须包含main方法,再添加Spring Boot启动方法: SpringApplication.run(SampleController.class, args); ...

  6. Spring Boot 入门详细分析

    推荐阅读: 我们为什么要学习 Spring Boot 我们搭建 Spring Boot 项目,可以使用 Spring 为我们提供的初始化网站,那个可能不太方便,今天呢,我们就来说说如何使用 IDEA ...

  7. 3步轻松搞定Spring Boot缓存

    作者:谭朝红 前言 本次内容主要介绍基于Ehcache 3.0来快速实现Spring Boot应用程序的数据缓存功能.在Spring Boot应用程序中,我们可以通过Spring Caching来快速 ...

  8. Spring Boot 集成 Ehcache 缓存,三步搞定!

    作者:谭朝红 www.ramostear.com/articles/spring_boot_ehcache.html 本次内容主要介绍基于Ehcache 3.0来快速实现Spring Boot应用程序 ...

  9. 带有外部Tomcat的Spring Boot

    在本文中,我将如何在外部Tomcat上运行Spring Boot应用程序.对我来说,这是一个现实的场景,我必须解决这个问题,因此也请教了一下优锐课老师,得到了很多帮助.也希望当你遇到类似问题时,能为你 ...

随机推荐

  1. 获取iframe外的document

    在iframe中点击弹出层外部分弹出层消失,但是点击iframe外部分就操作不了弹出层了,被这个问题困扰了不少时间,今天得以解决,代码如下: 说明:$(top.document,document).c ...

  2. Ubuntu18.04 内核升级

    查看当前版本  在终端输入以下命令并回车 uname -sr  可以发现当前内核为 Linux 4.15.0-88-generic 查看目前最新的稳定内核  访问 The Linux Kernel A ...

  3. test_1 计算字符串最后一个单词的长度,单词以空格隔开

    题目描述:计算字符串最后一个单词的长度,单词以空格隔开.  输入描述: 一行字符串,非空,长度小于5000. 输出描述: 整数N,最后一个单词的长度. #coding=utf-8 str = raw_ ...

  4. Bootstrap实战 - 注册和登录

    一.介绍 注册和登录在社交和商业网站中是必不可少的一个部分. 二.知识点 2.1 标签页 2.1.1 基础标签页 标签页的使用与导航栏类似,同时都依赖于基础样式 nav,不同的是附加样式变成了 nav ...

  5. leetcode 645. 错误的集合

    问题描述 集合 S 包含从1到 n 的整数.不幸的是,因为数据错误,导致集合里面某一个元素复制了成了集合里面的另外一个元素的值,导致集合丢失了一个整数并且有一个元素重复. 给定一个数组 nums 代表 ...

  6. Linux - 文件处理

    链接服务器 ssh 使用ssh:ssh -p22 username@host(服务器地址) 输入后会提示输入密码 -p22是ssh默认端口 可以不用 登录之后会默认处于 home 路径 xshell ...

  7. 【记录一个问题】cv::cuda::dft()比cv::dft()慢很多

    具体的profile调用图如下: 可以看见compute很快,但是构造函数很慢. nvidia官网看到几篇类似的帖子,但是没有讲明白怎么解决的: opencv上的参考文档:https://docs.o ...

  8. java匿名内部类概述

    1 package face_09; 2 /* 3 * 匿名内部类.就是内部类的简写格式. 4 * 必须有前提: 5 * 内部类必须继承或者实现一个外部类或者接口. 6 * 匿名内部类:其实就是一个匿 ...

  9. 裸k8s搭建中遇到的两个坑

    在装docker的时候报错了,需要先安装selinux版本.才能安装容器. 需要按照提示安装这个包. 采用强制安装.rpm -ivh 包名字 --force --nodeps 在k8s的master上 ...

  10. 学习JAVAWEB第十一天

    今天以及明天做登录案例,复习所学知识.