SpringBoot的启动流程

原创 2018年04月16日 00:03:51

作为一个高级程序员,一定要多看开源框架源码。从大师那里学的一些编程技巧。因此将自己看SpringBoot的心得总结一下。

为了更加直观的描述SpringBoot的启动流程,这里给出SpringBoot的启动时序图,本文将根据这个时序图作详细描述。


很容易知道SpringBoot的启动类为SpringApplication。从SpringBoot的源码看他的启动方法就两个大的方法分别是initialize(source)和run(args)方法。

initialize(source)

initialize方法主要是初始化ApplicationListener.class接口和ApplicationContextInitializer.class接口这两类对象。

这两步的处理方式为通过扫描包下面的META-INFO/spring.factories文件。读取org.springframework.context.ApplicationContextInitializer和org.springframework.context.ApplicationListener两个键的值来构建ApplicationContextInitializer和ApplicationListener。

扫描完成后的上下文构造器有

org.springframework.boot.context.ConfigurationWarningsApplicationContextInitializer

org.springframework.boot.context.ContextIdApplicationContextInitializer

org.springframework.boot.context.config.DelegatingApplicationContextInitializer

org.springframework.boot.context.embedded.ServerPortInfoApplicationContextInitializer

org.springframework.boot.autoconfigure.SharedMetadataReaderFactoryContextInitializer

org.springframework.boot.autoconfigure.logging.AutoConfigurationReportLoggingInitializer

扫描完成后的监听器有

org.springframework.boot.ClearCachesApplicationListener

org.springframework.boot.builder.ParentContextCloserApplicationListener

org.springframework.boot.context.FileEncodingApplicationListener

org.springframework.boot.context.config.AnsiOutputApplicationListener

org.springframework.boot.context.config.ConfigFileApplicationListener

org.springframework.boot.context.config.DelegatingApplicationListener

org.springframework.boot.liquibase.LiquibaseServiceLocatorApplicationListener

org.springframework.boot.logging.ClasspathLoggingApplicationListener

org.springframework.boot.logging.LoggingApplicationListener

org.springframework.boot.autoconfigure.BackgroundPreinitializer

run(args)

run方法可以总结为如下流程

一、记录应用启动时间

二、启动SpringApplicationRunListeners这一类的监听器

扫描方式与上面初始化的方法一致扫描结果为org.springframework.boot.context.event.EventPublishingRunListener内部得listeners为EventPublishingRunListener。主要执行上面初始化监器的onApplicationEvent()方法响应ApplicationStartedEvent事件。

三、准备SpringBoot的环境prepareEnvironment

主要执行上面初始化监器的onApplicationEvent()方法响应ApplicationEnvironmentPreparedEvent事件。

四、打印SpringBoot的启动Banner即printBanner

五、创建SpringBoot的应用上下文createApplicationContext

此处实例化AnnotationConfigEmbeddedWebApplicationContext对象创建了this.reader = new AnnotatedBeanDefinitionReader(this);this.scanner = new ClassPathBeanDefinitionScanner(this);这两个Bean定业读取器和扫描器。

六、准备SpringBoot的上下文需要的资源prepareContext

此处创建ClassPathBeanDefinitionScanner进行类加载Load开始加载SpringApplication的启动类。然后发布ApplicationPreparedEvent事件

七、进一步完善Context里面的内容refreshContext

这里主要加载业务Bean   

// Prepare this context for refreshing.
prepareRefresh();

// Tell the subclass to refresh the internal bean factory.
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

// Prepare the bean factory for use in this context.
prepareBeanFactory(beanFactory);

try {
	// Allows post-processing of the bean factory in context subclasses.
	postProcessBeanFactory(beanFactory);

	// Invoke factory processors registered as beans in the context.
	invokeBeanFactoryPostProcessors(beanFactory);

	// Register bean processors that intercept bean creation.
	registerBeanPostProcessors(beanFactory);

	// Initialize message source for this context.
	initMessageSource();

	// Initialize event multicaster for this context.
	initApplicationEventMulticaster();

	// Initialize other special beans in specific context subclasses.
	onRefresh();

	// Check for listener beans and register them.
	registerListeners();

	// Instantiate all remaining (non-lazy-init) singletons.
	finishBeanFactoryInitialization(beanFactory);

	// Last step: publish corresponding event.
	finishRefresh();
}

其中invokeBeanFactoryPostProcessors(beanFactory)进行启动类注解扫描。

doProcessConfigurationClass方法

Set<AnnotationAttributes> componentScans = AnnotationConfigUtils.attributesForRepeatable(
				sourceClass.getMetadata(), ComponentScans.class, ComponentScan.class);

其中doScan进行包扫描

return scanner.doScan(StringUtils.toStringArray(basePackages));

如果是Servlet应用则在initApplicationEventMulticaster注册Servlet和filiter()

在finishBeanFactoryInitialization()创建请求映射Mapper

在finishRefresh启动Tomcat操作。

启动Tomcat等操作

八、处理Context完全创建后的事情afterRefresh

执行callRunners

九、记录应用启动时间花费

十、打印应用启动成功后的日志信息。

Spring boot启动运行流程

运行流程:1:判断是否是web环境 2:加载所有classpath下面的META-INF/spring.factories ApplicationContextInitializer 3:加载...
  • fxllong262553
  • fxllong262553
  • 2017-10-31 14:42:05
  • 195

97. SpringBoot-启动流程分析第一篇

感谢网友给我的打赏,感谢Leonzhang的支付宝打赏,非常感谢!         《从零开始学Spring Boot》系列博客已经介绍了不少篇幅了,有些博友说要介绍下理论的知识,确实本系列博客都是...
  • gebitan505
  • gebitan505
  • 2017-02-13 11:20:25
  • 958

SpringBoot-启动流程分析

SpringBoot核心启动类的SpringApplication流程分析。上一篇用SpringBoot快速搭建并启动了一个WEB服务。有两个点与Spring的项目启动有不同,这里我们分析Spring...
  • doegoo
  • doegoo
  • 2016-09-08 14:42:04
  • 11834

Spring Boot启动流程

引言早在15年的时候就开始用spring boot进行开发了,然而一直就只是用用,并没有深入去了解spring boot是以什么原理怎样工作的,说来也惭愧。今天让我们从spring boot启动开始,...
  • nethackatschool
  • nethackatschool
  • 2017-09-21 13:58:00
  • 246

SpringBoot 之 启动过程

通过main方法启动的过程: @SpringBootApplication public class TestApplication extends SpringBootServletIniti...
  • u013725455
  • u013725455
  • 2018-02-24 11:52:25
  • 81

springboot启动流程

SpringBoot启动流程 一句话总结:在context的refresh方法中,需要注册bean definition,实例化bean.在加载bean defintion的时候使用Configur...
  • findbestoy
  • findbestoy
  • 2018-03-30 14:21:47
  • 35

Spring Boot启动流程详解(一)

转载:http://www.cnblogs.com/xinzhao/p/5551828.html 环境 本文基于Spring Boot版本1.3.3, 使用了spring-boot-sta...
  • q1512451239
  • q1512451239
  • 2016-11-25 18:14:35
  • 683

zygote启动流程

  • 2011年11月17日 23:39
  • 40KB
  • 下载

SpringBoot启动流程简析(三)

我们在上一节中说了SpringBoot的应用上下文的对象是AnnotationConfigEmbeddedWebApplicationContext,通过名字直译就是注解配置的可嵌入的web应用上下文...
  • zknxx
  • zknxx
  • 2017-12-20 23:00:54
  • 243

SpringBoot启动流程详解(搬运)

SpringBoot启动
  • wuxiaozeng
  • wuxiaozeng
  • 2016-12-31 23:15:02
  • 266
收藏助手
不良信息举报
您举报文章:SpringBoot的启动流程
举报原因:
原因补充:

(最多只允许输入30个字)