文档章节

SpringBoot:深入探索内嵌tomcat启动流程

wiitht
 wiitht
发布于 2017/08/16 16:23
字数 408
阅读 201
收藏 0
点赞 0
评论 0

1.SpringBoot启动过程中所涉及的类:

springApplication -> run
stopwatch
AnnotationConfigApplicationContext: register, refresh  ->
AbstractApplicationContext -> refresh
AnnotationConfigEmbeddedWebApplicationContext
XmlBeanDefinitionReader
RepositoryConfigurationDelegate 
ClassPathMapperScanner
ConfigurationClassPostProcessor
GenericScope
AutowiredAnnotationBeanPostProcessor
TomcatEmbeddedServletContainer
StandardService
StandardEngine
WebApplicationContext
ContextLoader
ServletRegistrationBean
FilterRegistrationBean
RequestMappingHandlerMapping
EndpointHandlerMapping
SimpleUrlHandlerMapping
RequestMappingHandlerAdapter
ExceptionHandlerExceptionResolver
arterDeprecationWarningAutoConfiguration
URLConfigurationSource
AnnotationMBeanExporter
DefaultLifecycleProcessor
DocumentationPluginsBootstrapper
ApiListingReferenceScanner
CachingOperationNameGenerator
TomcatEmbeddedServletContainer
Application

2.初步分析SpringBoot启动过程

先看看在SpringApplication.run方法做了什么:

public ConfigurableApplicationContext run(String... args) {
		StopWatch stopWatch = new StopWatch();
		stopWatch.start();
		ConfigurableApplicationContext context = null;
		FailureAnalyzers analyzers = null;
		configureHeadlessProperty();
		SpringApplicationRunListeners listeners = getRunListeners(args);
		listeners.started();
		try {
			ApplicationArguments applicationArguments = new DefaultApplicationArguments(
					args);
			ConfigurableEnvironment environment = prepareEnvironment(listeners,
					applicationArguments);
			Banner printedBanner = printBanner(environment);
			context = createApplicationContext();
			analyzers = new FailureAnalyzers(context);
			prepareContext(context, environment, listeners, applicationArguments,
					printedBanner);
			refreshContext(context);
			afterRefresh(context, applicationArguments);
			listeners.finished(context, null);
			stopWatch.stop();
			if (this.logStartupInfo) {
				new StartupInfoLogger(this.mainApplicationClass)
						.logStarted(getApplicationLog(), stopWatch);
			}
			return context;
		}
		catch (Throwable ex) {
			handleRunFailure(context, listeners, analyzers, ex);
			throw new IllegalStateException(ex);
		}
	}

其中refreshContext内部执行了refresh方法

protected void refresh(ApplicationContext applicationContext) {
		Assert.isInstanceOf(AbstractApplicationContext.class, applicationContext);
		((AbstractApplicationContext) applicationContext).refresh();
	}

这个方法会刷新整个应用需要启动的东西,具体的在AbstractApplicationContext中refresh方法内部可以看到所有要启动加载的东西:

 public void refresh() throws BeansException, IllegalStateException {
        Object var1 = this.startupShutdownMonitor;
        synchronized(this.startupShutdownMonitor) {
            this.prepareRefresh();
            ConfigurableListableBeanFactory beanFactory = this.obtainFreshBeanFactory();
            this.prepareBeanFactory(beanFactory);

            try {
                this.postProcessBeanFactory(beanFactory);
                this.invokeBeanFactoryPostProcessors(beanFactory);
                this.registerBeanPostProcessors(beanFactory);
                this.initMessageSource();
                this.initApplicationEventMulticaster();
                this.onRefresh();
                this.registerListeners();
                this.finishBeanFactoryInitialization(beanFactory);
                this.finishRefresh();
            } catch (BeansException var9) {
                if(this.logger.isWarnEnabled()) {
                    this.logger.warn("Exception encountered during context initialization - cancelling refresh attempt: " + var9);
                }

                this.destroyBeans();
                this.cancelRefresh(var9);
                throw var9;
            } finally {
                this.resetCommonCaches();
            }

        }
    }

在这个过程中会加载相应的xml,启动注册要加载的bean,启动tomcat等等

tomcat启动的过程会异步启动一个守护监听的scoket线程,这个线程通过NIOChannel包装;当第一次收到请求的时候会初始化相关的scoketWrapper数据,并在调用的过程中将socket的数据以http协议的方式转化成HttpRequest对象,并且在过程中会通过wrapper找到相应的dispacthservelt然后调用filter, 具体的controller.

 

 

 

© 著作权归作者所有

共有 人打赏支持
wiitht
粉丝 2
博文 158
码字总数 113789
作品 0
深圳
架构师
SpringBoot | 第一章:第一个SpringBoot应用

SpringBoot | 第一章:第一个SpringBoot应用 springboot简单介绍 概述 随着动态语言的流行(Ruby、Groovy、Scala、Node.js),Java的开发显得格外的笨重:繁多的配置、低下的开发效率、复杂的...

oKong
前天
0
0
Spring Boot入门资料整理

Spring Boot 初识 SpringBoot前世今生 本文主要讲述spring boot的由来,即其它诞生的背景,初衷,现状,及对未来的展望。 Spring Boot参考指南中文版--Chapter1.Spring Boot中文文档 本节提供...

小致dad
2017/11/07
0
0
Spring Boot Jar包转War包 部署到Tomcat下

我们都知道springBoot中已经内置了tomcat,是不需要我们额外的配置tomcat服务器的,但是有时这也可能是我们的一个瓶颈,因为如果我们需要对tomcat做集群或者一些优化的话是非常不方便的,所以...

阿刚ABC
2017/11/06
0
0
springboot 是如何帮我们省去web.xml配置的

概述 最开始使用原生的springmvc时,总是免不了有如下xml配置 但是,切换到springboot之后,web.xml之类的繁琐的配置基本上都不见了。出于好奇研究了下springboot究竟帮我们做了什么,我们可...

端吉
06/23
0
0
Spring Boot干货系列: (三)启动原理解析

     前言   前面几章我们见识了SpringBoot为我们做的自动配置,确实方便快捷,但是对于新手来说,如果不大懂SpringBoot内部启动原理,以后难免会吃亏。所以这次博主就跟你们一起一步步...

后端编程嘟
2017/03/13
0
0
SpringBoot之项目打war包和jar包-yellowcong

这一章,介绍关于SpringBoot如何打成war包和jar包的,具体步骤:1、配置pom.xml的tomcat,2、在pom.xml配置springboot的启动类,3、配置打包方式,4、配置启动类情况。我这个地方是吃了一个亏啊...

yelllowcong
04/13
0
0
SpringBoot 项目搭建 打包 运行

搭建一个非常简单的springboot项目,只有图片访问的功能。springboot项目其实很灵活,可以打成jar包运行,静态资源的路径也可以随意配置,也可以打成war包配合tomcat运行。 1. 新建maven项目...

千里明月
06/21
0
0
SpringBoot 入门实例

SpringBoot 是由 pivotal 提供的 Java 开发框架,伴随着 spring 4.0 版本一起发布,旨在简化 Spring 项目的初始化及开发过程,框架本身为开发过程提供了大量的默认配置,当然我们也可以通过简...

Aotian
05/29
0
0
springboot 开发入门,及问题汇总

1 . springboot简单介绍(http://projects.spring.io/spring-boot/) 现在的web项目几乎都会用到spring框架,而要使用spring难免需要配置大量的xml配置文件,而springboot的出现解 决了这一问...

崔江昆
2015/03/18
0
30
SpringBoot 2.0 系列001 -- 入门介绍以及相关概念

SpringBoot 2.0 系列001 -- 入门介绍以及相关概念 什么是SpringBoot? 项目地址:http://projects.spring.io/spring-boot/ SpringBoot介绍 Spring Boot使开发独立的,产品级别的基于Spring的...

路上有你0314
05/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

shell中的函数、shell中的数组、告警系统需求分析

shell中的函数 格式: 格式: function f_name() { command } 函数必须要放在最前面 示例1(用来打印参数) 示例2(用于定义加法) 示例3(用于显示IP) shell中的数组 shell中的数组1 定义数...

Zhouliang6
33分钟前
1
0
用 Scikit-Learn 和 Pandas 学习线性回归

      对于想深入了解线性回归的童鞋,这里给出一个完整的例子,详细学完这个例子,对用scikit-learn来运行线性回归,评估模型不会有什么问题了。 1. 获取数据,定义问题     没有...

wangxuwei
55分钟前
0
0
MAC安装MAVEN

一:下载maven压缩包(Zip或tar可选),解压压缩包 二:打开终端输入:vim ~/.bash_profile(如果找不到该文件新建一个:touch ./bash_profile) 三:输入i 四:输入maven环境变量配置 MAVEN_HO...

WALK_MAN
今天
0
0
33.iptables备份与恢复 firewalld的9个zone以及操作 service的操作

10.19 iptables规则备份和恢复 10.20 firewalld的9个zone 10.21 firewalld关于zone的操作 10.22 firewalld关于service的操作 10.19 iptables规则备份和恢复: ~1. 保存和备份iptables规则 ~2...

王鑫linux
今天
1
0
大数据教程(2.11):keeperalived+nginx高可用集群搭建教程

上一章节博主为大家介绍了目前大型互联网项目的系统架构体系,相信大家应该注意到其中很重要的一块知识nginx技术,在本节博主将为大家分享nginx的相关技术以及配置过程。 一、nginx相关概念 ...

em_aaron
今天
0
0
Apache Directory Studio连接Weblogic内置LDAP

OBIEE默认使用Weblogic内置LDAP管理用户及组。 要整理已存在的用户及组,此前办法是导出安全数据,文本编辑器打开认证文件,使用正则表达式获取用户及组的信息。 后来想到直接用Apache Dire...

wffger
今天
2
0
HFS

FS,它是一种上传文件的软件。 专为个人用户所设计的 HTTP 档案系统 - Http File Server,如果您觉得架设 FTP Server 太麻烦,那么这个软件可以提供您更方便的档案传输系统,下载后无须安装,...

garkey
今天
1
0
Java IO类库之BufferedInputStream

一、BufferedInputStream介绍 /** * A <code>BufferedInputStream</code> adds * functionality to another input stream-namely, * the ability to buffer the input and to * sup......

老韭菜
今天
0
0
STM 32 窗口看门狗

http://bbs.elecfans.com/jishu_805708_1_1.html https://blog.csdn.net/a1985831055/article/details/77404131...

whoisliang
昨天
0
0
Dubbo解析(六)-服务调用

当dubbo消费方和提供方都发布和引用完成后,第四步就是消费方调用提供方。 还是以dubbo的DemoService举例 -- 提供方<dubbo:application name="demo-provider"/><dubbo:registry address="z...

青离
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部