Spring Boot启动流程断点过程解析

这篇文章主要介绍了Spring Boot启动流程断点过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

启动入口

跟进run方法 : 一个用来使用默认的配置从特定的源运行SpringApplication的静态帮助类。

这个类有两个重载方法,另一个用来传入多个源。通常,单个参数方法是数组方法的一个特例

创建一个新的SpringApplication实例。这个应用程序上下文会从特定的源加载Beans,这个实例会在调用run方法之前被定制化。

Web应用程序类型的枚举:WebApplicationType,包含NONE(不是web应用),SERVLET(基于Servlet的web应用),REACTIVE(基于Reactive的web应用)

  • 直接jar包运行不使用web容器
  • 使用嵌入式的Servlet web容器
  • 使用反应式的web容器

setInitializers((Collection) getSpringFactoriesInstances(
  ApplicationContextInitializer.class));

用于创建和加载Spring工厂方法实例

4.运行SpringApplication的run方法

Java SPI在 Spring Boot中的应用

SpringBoot底层的自动化都是由这些SPI实现类来实现的:初始化,监听器,自动配置导入监听器,自动配置导入过滤器,自动配置,失败分析器,可用模板提供者

Spring Boot找到main方式的方式

通过抛异常的形式来获取堆栈信息,再获取启动类的信息。

以上都是new SpringBootApplication的过程,下面分析run方法

/**
* Run the Spring application, creating and refreshing a new
* {@link ApplicationContext}.
* 运行一个Spring应用,创建和刷新一个新的ApplicationContext
* @param args the application arguments (usually passed from a Java main method)
* 应用参数通过java main方法传递过来
* @return a running {@link ApplicationContext}
*/
public ConfigurableApplicationContext run(String... args) {
// 任务计时器工具,可同时计数多个任务
StopWatch stopWatch = new StopWatch();
stopWatch.start();
//ApplicationContext是Spring的中心接口,为应用提供配置:1bean工厂2加载资源3注册的监听器发布事件4解析消息
ConfigurableApplicationContext context = null;
Collection<SpringBootExceptionReporter> exceptionReporters = new ArrayList<>();
//headless 模式:服务器端模式,表示系统没有键盘鼠标等前端应用
configureHeadlessProperty();
//监听器容器,对run方法各个阶段事件进行监听,观察者模式
SpringApplicationRunListeners listeners = getRunListeners(args);
//监听相应的事件,SpringApplicationEvent下的一个实现
listeners.starting();
try {
//提供了对于运行SpringApplication参数的访问
ApplicationArguments applicationArguments = new DefaultApplicationArguments(
args);
//环境配置:是servlet,reactive或者java应用环境,触发evn准备好的事件
ConfigurableEnvironment environment = prepareEnvironment(listeners,
applicationArguments);
configureIgnoreBeanInfo(environment);
Banner printedBanner = printBanner(environment);
context = createApplicationContext();
exceptionReporters = getSpringFactoriesInstances(
SpringBootExceptionReporter.class,
new Class[] { ConfigurableApplicationContext.class }, context);
prepareContext(context, environment, listeners, applicationArguments,
printedBanner);
refreshContext(context);
afterRefresh(context, applicationArguments);
stopWatch.stop();
if (this.logStartupInfo) {
new StartupInfoLogger(this.mainApplicationClass)
.logStarted(getApplicationLog(), stopWatch);
}
listeners.started(context);
callRunners(context, applicationArguments);
}
catch (Throwable ex) {
handleRunFailure(context, ex, exceptionReporters, listeners);
throw new IllegalStateException(ex);
}

try {
listeners.running(context);
}
catch (Throwable ex) {
handleRunFailure(context, ex, exceptionReporters, null);
throw new IllegalStateException(ex);
}
return context;
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

时间: 2019-11-27

如何更优雅地获取spring boot yml中的值

前言 偶然看到国外论坛有人在吐槽同事从配置文件获取值的方式,因此查阅了相关资料发现确实有更便于管理更优雅的获取方式. github demo地址: springboot-yml-value 1.什么是yml文件 application.yml取代application.properties,用来配置数据可读性更强,尤其是当我们已经制定了很多的层次结构配置的时候. 下面是一个非常基本的yml文件: server: url: http://localhost myapp: name: MyAppli

springboot自动配置没有生效的问题定位(条件断点)

Spring Boot在为开发人员提供更高层次的封装,进而提高开发效率的同时,也为出现问题时如何进行定位带来了一定复杂性与难度.但Spring Boot同时又提供了一些诊断工具来辅助开发与分析,如spring-boot-starter-actuator.本文分享一个基于actuator与IDEA条件断点来定位自动配置未生效的案例.望对类似问题分析与处理提供参考. 问题确认 在前文介绍的 Spring Boot从入门到实战:整合通用Mapper简化单表操作 中,我们对druid连接池做了自动配置,

SpringBoot项目设置断点debug调试无效忽略web.xml问题的解决

刚接触springboot项目, (1)发现断点debug调试无效,很郁闷,网上搜索解决办法. 看到的都是一些很复杂的方案,说是远程调试,还要另外开端口号.这和传统的项目不一样,因此觉得没必要. 所以经过摸索,发现有一种更加简单的方式,步骤如下: 在pom文件的plugin部分加上一段配置: <configuration> <fork>false</fork> </configuration> 这样就ok了: (2)关于SpringBoot项目中报错说web

SpringBoot中如何启动Tomcat流程

前面在一篇文章中介绍了 Spring 中的一些重要的 context.有一些在此文中提到的 context,可以参看上篇文章. SpringBoot 项目之所以部署简单,其很大一部分原因就是因为不用自己折腾 Tomcat 相关配置,因为其本身内置了各种 Servlet 容器.一直好奇: SpringBoot 是怎么通过简单运行一个 main 函数,就能将容器启动起来,并将自身部署到其上 .此文想梳理清楚这个问题. 我们从SpringBoot的启动入口中分析: Context 创建 // Crea

springboot中swagger快速启动流程

介绍 可能大家都有用过swagger,可以通过ui页面显示接口信息,快速和前端进行联调. 没有接触的小伙伴可以参考官网文章进行了解下demo页面. 多应用 当然在单个应用大家可以配置SwaggerConfig类加载下buildDocket,就可以快速构建好swagger了. 代码大致如下: /** * Swagger2配置类 * 在与spring boot集成时,放在与Application.java同级的目录下. * 通过@Configuration注解,让Spring来加载该类配置. * 再

基于logback 实现springboot超级详细的日志配置

前言 java web 下有好几种日志框架,比如:logback,log4j,log4j2(slj4f 并不是一种日志框架,它相当于定义了规范,实现了这个规范的日志框架就能够用 slj4f 调用).其中性能最高的应该使 logback 了,而且 springboot 默认使用的也是 logback 日志,所以本篇将会详细的讲解 logback 的日志配置方案. 本篇主要内容如下: •logback 配置文件的构成 •如何将日志输出到文件 •如何按时间,按大小切分日志 •如何将让一个日志文件中只有

spring boot容器启动流程

一.前言 spring cloud大行其道的当下,如果不了解基本原理那么是很纠结的(看见的都是 约定大于配置 ,但是原理呢?为什么要这么做?).spring cloud是基于spring boot快速搭建的,今天咱们就看看spring boot容器启动流程.(本文不讲解如何快速启动spring boot,那些直接官方看即可, 官网文档飞机票 ) 二.容器启动 spring boot一般是 指定容器启动main方法,然后以命令行方式启动Jar包 ,如下图: @SpringBootApplicati

Spring Boot启动流程分析

引言 早在15年的时候就开始用spring boot进行开发了,然而一直就只是用用,并没有深入去了解spring boot是以什么原理怎样工作的,说来也惭愧.今天让我们从spring boot启动开始,深入了解一下spring boot的工作原理. 为什么用spring boot 在使用一个东西或者一个工具之前,我们总是会问自己,我为什么要用?用他能给我带来什么好处? * 最大的好处就是spring boot遵从了java**约定大于配置**不用面对一大堆的配置文件,spring boot是根据

spring boot启动加载数据原理分析

实际应用中,我们会有在项目服务启动的时候就去加载一些数据或做一些事情这样的需求. 为了解决这样的问题,spring Boot 为我们提供了一个方法,通过实现接口 CommandLineRunner 来实现. 创建实现接口 CommandLineRunner 的类,通过@Component注解,就可以实现启动时加载数据项.使用@Order 注解来定义执行顺序. IndexStartupRunner.Java类: import org.springframework.boot.CommandLine

详解Spring IOC 容器启动流程分析

使用 Spring 时,XML 和注解是使用得最多的两种配置方式,虽然是两种完全不同的配置方式,但对于 IOC 容器来说,两种方式的不同主要是在 BeanDefinition 的解析上.而对于核心的容器启动流程,仍然是一致的. AbstractApplicationContext 的 refresh 方法实现了 IOC 容器启动的主要逻辑,启动流程中的关键步骤在源码中也可以对应到独立的方法.接下来以  AbstractApplicationContext 的实现类  ClassPathXmlAp

Spring Boot启动过程(六)之内嵌Tomcat中StandardHost、StandardContext和StandardWrapper的启动教程详解

StandardEngine[Tomcat].StandardHost[localhost]的启动与StandardEngine不在同一个线程中,它的start: // Start our child containers, if any Container children[] = findChildren(); List<Future<Void>> results = new ArrayList<>(); for (int i = 0; i < childre

Spring Boot启动过程完全解析(一)

之前在排查一个线上问题时,不得不仔细跑了很多遍Spring Boot的代码,于是整理一下,我用的是1.4.3.RELEASE. 首先,普通的入口,这没什么好说的,我就随便贴贴代码了: SpringApplication.run(Application.class, args); --> public static ConfigurableApplicationContext run(Object source, String... args) { return run(new Object[]

Spring Boot启动时调用自己的非web逻辑

在spring Boot中,有些代码是WEB功能,例如API等,但是有些逻辑是非WEB,启动时就要调用并持续运行的,该如何加载自己的非WEB逻辑呢? SpringBootApplication类实现CommandLineRunner并覆盖run()方法 @SpringBootApplication public class ZjkApplication implements CommandLineRunner{ /** * @param args */ public static void ma

Spring Boot启动过程完全解析(二)

上篇给大家介绍了Spring Boot启动过程完全解析(一),大家可以点击参考下 该说refreshContext(context)了,首先是判断context是否是AbstractApplicationContext派生类的实例,之后调用了强转为AbstractApplicationContext类型并调用它的refresh方法.由于AnnotationConfigEmbeddedWebApplicationContext继承自EmbeddedWebApplicationContext,所以会

Spring Boot启动过程(五)之Springboot内嵌Tomcat对象的start教程详解

标题和Spring Boot启动过程(四)之Spring Boot内嵌Tomcat启动很像,所以特别强调一下,这个是Tomcat对象的. 从TomcatEmbeddedServletContainer的this.tomcat.start()开始,主要是利用LifecycleBase对这一套容器(engine,host,context及wrapper)进行启动并发布诸如configure_start.before_init.after_start的lifecycleEvent事件给相应的监听器(如

Spring Boot启动过程(四)之Spring Boot内嵌Tomcat启动

之前在Spring Boot启动过程(二)提到过createEmbeddedServletContainer创建了内嵌的Servlet容器,我用的是默认的Tomcat. private void createEmbeddedServletContainer() { EmbeddedServletContainer localContainer = this.embeddedServletContainer; ServletContext localServletContext = getServ