2. Spring Boot项目启动原理初探
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项目启动原理初探相关推荐
- Spring Boot 项目启动原理彻底解剖分析
文章目录 一.场景介绍 二.项目搭建 三.解体 JAR 包 四.原理分析 一.场景介绍 spring-boot 项目搭建以后启动方式一般有两种: 源码方式启动 @SpringBootApplicati ...
- Spring Boot(18)---启动原理解析
Spring Boot(18)---启动原理解析 前言 前面几章我们见识了SpringBoot为我们做的自动配置,确实方便快捷,但是对于新手来说,如果不大懂SpringBoot内部启动原理,以后难免会 ...
- Spring Boot项目启动的几种方式
Spring Boot项目启动的几种方式 方式一:右击启动或者点击intellij右上角的启动按钮 我们访问下浏览器看一下效果 方式二:利用maven启动 我们先进入到项目文件下,然后执行命令 m ...
- 硬核艿艿,新鲜出炉,直接带你弄懂 Spring Boot Jar 启动原理!
" 摘要: 原创出处 http://www.iocoder.cn/Spring-Boot/jar/ 「芋道源码」欢迎转载,保留摘要,谢谢! 1. 概述 2. MANIFEST.MF 3. J ...
- spring boot应用启动原理分析
spring boot quick start 在spring boot 里,很吸引人的一个特性是可以直接把应用打包成为一个jar/war,然后这个jar/war是可以直接启动的,不需要另外配置一个W ...
- 记一次 Spring Boot 项目启动卡住问题排查记录
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 陈凯玲 来源 | https://url.cn ...
- 记一次spring boot项目启动失败
最近在macos下启动spring boot 项目的时候启动失败,报错信息如下: org.postgresql.util.PSQLException: 尝试连线已失败.at org.postgresq ...
- Whitelabel Error Page : spring boot项目启动后,无法访问@RequestMapping标注的请求
springboot项目创建后,会自动生成一个标注有@SpringBootApplication注解的类,直接执行该类的main方法即可启动web项目,毕竟springboot已经内置了tomcat容 ...
- Spring Boot项目启动流程
概述 用过Spring Boot的应该都知道,在项目启动入口的主类main()方法里,一句简简单单的 SpringApplication.run( ... ); 便开启了项目的启动运行之路. 本文我们 ...
最新文章
- Exchange 2010 CAS安装之一
- java docx转html实例_Java实现将word转换为html的方法示例【doc与docx格式】
- ruby在类中访问@,类外访问调用方法
- 1、linux网络服务实验 用PuTTY连接Linux
- linux每日命令(1):which
- Codeforces 583 DIV2 Robot's Task 贪心
- 现代软件工程个人作业进度
- leetcode 39. Combination Sum(回溯算法)
- Atitit. 解决80端口 System 占用pid 4,,找到拉个程序或者服务占用http 80服务
- TI OSAL资料 整理
- 一文看懂3D封装技术
- 全网最详细的下载、安装和使用绘图神器draw.io(drawio),它比visio,processon,wps,亿图图示等更好用,最重要的是它免费
- elementUI 输入框添加小图标
- 数据重生:让神经机器翻译中的不活跃样本“复活”
- 系统——现有centos7操作系统制作为iso镜像文件
- 新概念英语第三册21-40课(转)
- ESP-iSYS数据库(实时数据库),API使用
- 09组团队项目-Alpha冲刺-1/6
- 打印等腰三角形图案[1]
- 游戏企业通关秘籍:华为云游戏全场景能力,开发+部署+运营“关关难过关关过”...
热门文章
- servlet3多文件上传_Servlet 3文件上传– @MultipartConfig,部分
- 去除Win10资源管理器中快速访问的“最近使用的文件”和“常用文件夹”
- oracle--Tracing PL/SQL subprogram calls with parameters values--Mahmoud Hatem,
- 1002. 三角形 (
- centos一键安装包无法创建vhost
- IO标准库类型之间的关系
- 有商在线进销存成功案例
- 均值(Mean)和均值标准误差(S.E. Mean)
- 深入理解Flink ---- 系统内部消息传递的exactly once语义
- C 语言实例 - 删除字符串中的特殊字符