springboot启动流程简单总结
Spring Boot程序有一个入口,就是main方法。main里面调用SpringApplication.run()启动整个Spring Boot程序,该方法所在类需要使用@SpringBootApplication复合注解。
其中需要关注的是:
@SpringBootApplication注解其实是包含了三个注解:
(1)@EnableAutoConfiguration:SpringBoot根据应用所声明的依赖来对Spring框架进行自动配置。简单概括一下就是,是借助@Import的帮助,将所有符合自动配置条件的bean定义加载到IoC容器。
(2)@Configuration:它就是JavaConfig形式的Spring Ioc容器的配置类。被标注的类等于在spring的XML配置文件中(applicationContext.xml),装配所有bean事务,提供了一个spring的上下文环境。
(3)@ComponentScan:组件扫描,可自动发现和装配Bean,功能其实就是自动扫描并加载符合条件的组件或者bean定义,最终将这些bean定义加载到IoC容器中。
二:详细解释:
1、SpringBoot启动的时候,会构造一个SpringApplication的实例,然后调用这个实例的run方法,在run方法调用之前,也就是构造SpringApplication的时候会进行初始化的工作,初始化的时候会做以下几件事:
(1)把参数sources设置到SpringApplication属性中,这个sources可以是任何类型的参数.
(2)判断是否是web程序,并设置到webEnvironment的boolean属性中.
(3)创建并初始化ApplicationInitializer,设置到initializers属性中 。
(4)创建并初始化ApplicationListener,设置到listeners属性中 。
(5)初始化主类mainApplicatioClass。
源代码:
private void initialize(Object[] sources) {
if (sources != null && sources.length > 0) {
//把sources设置到SpringApplication的sources属性中,目前只是一个MyApplication类对象
this.sources.addAll(Arrays.asList(sources));
}
//判断是否是web程序,并设置到webEnvironment的boolean属性中
this.webEnvironment = deduceWebEnvironment();
//找出所有的初始化器,默认有5个,设置到initializers属性中 。
setInitializers((Collection) getSpringFactoriesInstances(ApplicationContextInitializer.class));
//找出所有的应用程序监听器,默认有9个,设置到listeners属性中 。
setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));
//找出运行的主类(main class)
this.mainApplicationClass = deduceMainApplicationClass();
}
2、SpringApplication构造完成之后调用run方法,启动SpringApplication,run方法执行的时候会做以下几件事:
(1)构造一个StopWatch计时器,观察SpringApplication的执行 。
(2)获取SpringApplicationRunListeners并封装到SpringApplicationRunListeners中启动,用于监听run方法的执行。
(3)创建并初始化ApplicationArguments,获取run方法传递的args参数。
(4)创建并初始化ConfigurableEnvironment(环境配置)。
(5)打印banner(只用在Classpath下添加字符文件图标,就可以在启动时候打印)。
(3)构造Spring容器(ApplicationContext)上下文。
(4)SpringApplicationRunListeners发布finish事件。
(5)StopWatch计时器停止计时。
如果想要深入看详细的步骤,建议去网上搜索,很多作者都写了细节的部分。
可以参考我认为写的不错的两篇文章:
springboot启动流程简单总结的更多相关文章
- Springboot启动流程简单分析
springboot启动的类为SpringApplication,执行构造函数初始化属性值后进入run方法: 然后返回ConfigurableApplicationContext(spring应用). ...
- SpringBoot启动流程分析(六):IoC容器依赖注入
SpringBoot系列文章简介 SpringBoot源码阅读辅助篇: Spring IoC容器与应用上下文的设计与实现 SpringBoot启动流程源码分析: SpringBoot启动流程分析(一) ...
- SpringBoot启动流程分析(四):IoC容器的初始化过程
SpringBoot系列文章简介 SpringBoot源码阅读辅助篇: Spring IoC容器与应用上下文的设计与实现 SpringBoot启动流程源码分析: SpringBoot启动流程分析(一) ...
- SpringBoot启动流程及其原理
Spring Boot.Spring MVC 和 Spring 有什么区别? 分别描述各自的特征: Spring 框架就像一个家族,有众多衍生产品例如 boot.security.jpa等等:但他们的 ...
- SpringBoot 启动流程
SpringBoot 启动流程 加载 resources/META-INF/spring.factories 中配置的 ApplicationContextInitializer 和 Applicat ...
- SpringBoot源码学习3——SpringBoot启动流程
系列文章目录和关于我 一丶前言 在 <SpringBoot源码学习1--SpringBoot自动装配源码解析+Spring如何处理配置类的>中我们学习了SpringBoot自动装配如何实现 ...
- SpringBoot启动流程解析
写在前面: 由于该系统是底层系统,以微服务形式对外暴露dubbo服务,所以本流程中SpringBoot不基于jetty或者tomcat等容器启动方式发布服务,而是以执行程序方式启动来发布(参考下图ke ...
- SpringBoot启动流程分析(五):SpringBoot自动装配原理实现
SpringBoot系列文章简介 SpringBoot源码阅读辅助篇: Spring IoC容器与应用上下文的设计与实现 SpringBoot启动流程源码分析: SpringBoot启动流程分析(一) ...
- SpringBoot启动流程分析(一):SpringApplication类初始化过程
SpringBoot系列文章简介 SpringBoot源码阅读辅助篇: Spring IoC容器与应用上下文的设计与实现 SpringBoot启动流程源码分析: SpringBoot启动流程分析(一) ...
- SpringBoot启动流程分析(二):SpringApplication的run方法
SpringBoot系列文章简介 SpringBoot源码阅读辅助篇: Spring IoC容器与应用上下文的设计与实现 SpringBoot启动流程源码分析: SpringBoot启动流程分析(一) ...
随机推荐
- JavaWeb项目练习(学生选课管理系统)三【登录功能】
需求: 首页为用户登录页面,管理员,教师,学生三种角色用户登录后,进入相应的功能页. 在index.jsp文件里跳转到login.jsp页面,为了更好地书写 <%@ page contentTy ...
- 如何修改Ubuntu的时间与时间同步
1.安装ntpdate,同步标准时间 zce@ubuntu:~$ sudo apt install ntpdate 输入管理员密码确认安装 zce@ubuntu:~$ sudo apt install ...
- JavaWeb开发-CSS基础
2.CSS层叠样式表基本语法 层叠样式表,用来控制页面的样式 (1)CSS的三种引入方式 内部样式表:适合学习使用,将CSS代码写在style标签里面,style标签嵌套在title里 外部样式表:开 ...
- MongoDB是一个NoSQL数据库,有着多种不同的命令和操作。以下是一些常见的MongoDB命令:
show dbs:列出所有数据库 use db_name:切换到指定的数据库 db.dropDatabase():删除当前数据库 db.createCollection("collectio ...
- 开源 Serverless 框架 Laf 性能优化实践
介绍 Laf 是一个完全开源的 Serverless 框架,Laf 的 Node.js 运行时容器 (以下简称为 Runtime) 是 Laf 的函数执行环境,依托于 Express.js 框架.采用 ...
- java漏洞学习平台搭建
java漏洞平台搭建 项目地址 : https://github.com/j3ers3/Hello-Java-Sec 配置mvn 先配置一下mvn,下载后解压 proxychains wget htt ...
- rime中州韵 输入效果一览 100+增强功能效果
rime是一个定制化程度很高的输入法框架, 我们可以在该框架上搭建适合自己的输入法程序.我们将在专栏 小狼毫 Rime 保姆教程 中完成以下近百种定制化效果的配置与演示.欢迎订阅. 以下为个性化定制的 ...
- LeetCode 二分查找篇(69、33、704)
69. x 的平方根 实现 int sqrt(int x) 函数. 计算并返回 x 的平方根,其中 x 是非负整数. 由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去. 示例 1: 输入: ...
- Java 查找并高亮PDF中的跨行文本
以下内容介绍如何在Java后端程序中查找并高亮PDF文档中的跨行文本.本次测试环境如下: 源文档:PDF 编译工具:IntelliJ IDEA2018 JDK:1.8.0 PDF类库:free spi ...
- 【华为云技术分享】STM32L476移植华为LiteOS系列教程------背景知识 1
一.这篇文章想向大家说明一个问题,我们开发单片机的本质是什么? 在最早的开发中,我们没有Keil.IAR等等一系列好用的单片机集成开发环境,注意这里的"集成",是指将多个软件其中有 ...