SpringBoot从宏观上说,就是对spring容器进行了一层包装。它内部的入口是利用 SpringApplication类的static的 run 方法进行启动的,调用的图:

  

上图中的这些方法都位于org.springframework.boot.SpringApplication这个类中,由此可见SpringApplication这个类在springboot框架中的作用。

//调用示例:

public static void main(String[] args) throws Exception {
  SpringApplication.run(Examples.class, args);
}

SpringApplication类提供了两个static的run方法:

public static ConfigurableApplicationContext run(Object source, String... args) {return run(new Object[] { source }, args);
}public static ConfigurableApplicationContext run(Object[] sources, String[] args) {return new SpringApplication(sources).run(args);
}

上面两个方法其实就是一个,最终都会创建一个SringApplication实例,在构造时会处理传入的 sources 参数,而且这souces类可以是多个,调用的方式还可以这样:

public static void main(String[] args) throws Exception {

  Class<?>[] primarySources = new Class<?>[] { Examples.class , Examples1.class } ;
  SpringApplication.run( primarySources , args);
}

SpringApplication构造方法如下:

public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) {this.resourceLoader = resourceLoader;Assert.notNull(primarySources, "PrimarySources must not be null");this.primarySources = new LinkedHashSet<>(Arrays.asList(primarySources));this.webApplicationType = WebApplicationType.deduceFromClasspath();//用来查找每个jar和类路径下的/META-INF/spring.factories文件,并获取其中的特定接口的配置的setInitializers((Collection) getSpringFactoriesInstances( ApplicationContextInitializer.class)); //找出每个jar和类路径下的/META-INF/spring.factories文件中配置的ApplicationContextInitializer类setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));this.mainApplicationClass = deduceMainApplicationClass(); //推断出带有main方法的运行类
}

上面的代码通过构造完成初始化之后,紧接着就是调用SpringApplication类的实例 run方法,代码如下:

public ConfigurableApplicationContext run(String... args) {//StopWatch作用是用来统计spring实例运行时间StopWatch stopWatch = new StopWatch();stopWatch.start();//ConfigurableApplicationContext接口提供了对Spring容器的配置功能ConfigurableApplicationContext context = null;Collection<SpringBootExceptionReporter> exceptionReporters = new ArrayList<>();configureHeadlessProperty();SpringApplicationRunListeners listeners = getRunListeners(args);listeners.starting();try {ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);ConfigurableEnvironment environment = prepareEnvironment(listeners,applicationArguments);configureIgnoreBeanInfo(environment);Banner printedBanner = printBanner(environment);context = createApplicationContext();exceptionReporters = getSpringFactoriesInstances(SpringBootExceptionReporter.class,new Class[] { ConfigurableApplicationContext.class }, context);// 1. 会执行ApplicationContextInitializer接口进行初始化工作// 2. 对外发布监听事件// 3. 优先创建有特定作用的单例bean// 4. 把带有main方法的主类作为bean的配置源,并从配置源中加载bean信息到容器中
            prepareContext(context, environment, listeners, applicationArguments,printedBanner);//spring容器的生命周期处理,该方法完成后单例bean实例就创建了
            refreshContext(context);afterRefresh(context, applicationArguments);stopWatch.stop();if (this.logStartupInfo) {new StartupInfoLogger(this.mainApplicationClass).logStarted(getApplicationLog(), stopWatch);}//对外发布监听事件
            listeners.started(context);//我们在开发中可能会有这样的情景。需要在容器启动的时候执行一些内容。比如读取配置文件,数据库连接之类的。SpringBoot给我们提供了两个接口来帮助我们实现这种需求。这两个接口分别为CommandLineRunner和ApplicationRunner。他们的执行时机为容器启动完成的时候。
            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;}

至此,SpringApplication的实例run方法执行完成,该方法主要是完成spring容器的创建和启动

转载于:https://www.cnblogs.com/hzhuxin/p/7737945.html

2. Spring Boot项目启动原理初探相关推荐

  1. Spring Boot 项目启动原理彻底解剖分析

    文章目录 一.场景介绍 二.项目搭建 三.解体 JAR 包 四.原理分析 一.场景介绍 spring-boot 项目搭建以后启动方式一般有两种: 源码方式启动 @SpringBootApplicati ...

  2. Spring Boot(18)---启动原理解析

    Spring Boot(18)---启动原理解析 前言 前面几章我们见识了SpringBoot为我们做的自动配置,确实方便快捷,但是对于新手来说,如果不大懂SpringBoot内部启动原理,以后难免会 ...

  3. Spring Boot项目启动的几种方式

    Spring Boot项目启动的几种方式 方式一:右击启动或者点击intellij右上角的启动按钮 我们访问下浏览器看一下效果 方式二:利用maven启动 我们先进入到项目文件下,然后执行命令   m ...

  4. 硬核艿艿,新鲜出炉,直接带你弄懂 Spring Boot Jar 启动原理!

    " 摘要: 原创出处 http://www.iocoder.cn/Spring-Boot/jar/ 「芋道源码」欢迎转载,保留摘要,谢谢! 1. 概述 2. MANIFEST.MF 3. J ...

  5. spring boot应用启动原理分析

    spring boot quick start 在spring boot 里,很吸引人的一个特性是可以直接把应用打包成为一个jar/war,然后这个jar/war是可以直接启动的,不需要另外配置一个W ...

  6. 记一次 Spring Boot 项目启动卡住问题排查记录

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 陈凯玲 来源 | https://url.cn ...

  7. 记一次spring boot项目启动失败

    最近在macos下启动spring boot 项目的时候启动失败,报错信息如下: org.postgresql.util.PSQLException: 尝试连线已失败.at org.postgresq ...

  8. Whitelabel Error Page : spring boot项目启动后,无法访问@RequestMapping标注的请求

    springboot项目创建后,会自动生成一个标注有@SpringBootApplication注解的类,直接执行该类的main方法即可启动web项目,毕竟springboot已经内置了tomcat容 ...

  9. Spring Boot项目启动流程

    概述 用过Spring Boot的应该都知道,在项目启动入口的主类main()方法里,一句简简单单的 SpringApplication.run( ... ); 便开启了项目的启动运行之路. 本文我们 ...

最新文章

  1. Exchange 2010 CAS安装之一
  2. java docx转html实例_Java实现将word转换为html的方法示例【doc与docx格式】
  3. ruby在类中访问@,类外访问调用方法
  4. 1、linux网络服务实验 用PuTTY连接Linux
  5. linux每日命令(1):which
  6. Codeforces 583 DIV2 Robot's Task 贪心
  7. 现代软件工程个人作业进度
  8. leetcode 39. Combination Sum(回溯算法)
  9. Atitit. 解决80端口 System 占用pid 4,,找到拉个程序或者服务占用http 80服务
  10. TI OSAL资料 整理
  11. 一文看懂3D封装技术
  12. 全网最详细的下载、安装和使用绘图神器draw.io(drawio),它比visio,processon,wps,亿图图示等更好用,最重要的是它免费
  13. elementUI 输入框添加小图标
  14. 数据重生:让神经机器翻译中的不活跃样本“复活”
  15. 系统——现有centos7操作系统制作为iso镜像文件
  16. 新概念英语第三册21-40课(转)
  17. ESP-iSYS数据库(实时数据库),API使用
  18. 09组团队项目-Alpha冲刺-1/6
  19. 打印等腰三角形图案[1]
  20. 游戏企业通关秘籍:华为云游戏全场景能力,开发+部署+运营“关关难过关关过”...

热门文章

  1. servlet3多文件上传_Servlet 3文件上传– @MultipartConfig,部分
  2. 去除Win10资源管理器中快速访问的“最近使用的文件”和“常用文件夹”
  3. oracle--Tracing PL/SQL subprogram calls with parameters values--Mahmoud Hatem,
  4. 1002. 三角形 (
  5. centos一键安装包无法创建vhost
  6. IO标准库类型之间的关系
  7. 有商在线进销存成功案例
  8. 均值(Mean)和均值标准误差(S.E. Mean)
  9. 深入理解Flink ---- 系统内部消息传递的exactly once语义
  10. C 语言实例 - 删除字符串中的特殊字符