简析SpringBoot启动执行流程

简介: 简析一下SpringBoot的启动流程

SpringBoot已经成为Spring的主流框架了,经典的自动配置大大解放了开发的双手,今天就来简析一下SpringBoot的启动流程:

话不多说,直接撸铁:正常我们的SpringBoot启动类:

@SpringBootApplication
public class Demo1Application {
    public static void main(String[] args) {
        SpringApplication.run(Demo1Application.class, args);
    }
}

启动类的关键在于 @SpringBootApplication 这个注解,那我们就进去看下这个注解:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
    excludeFilters = {@Filter(
    type = FilterType.CUSTOM,
    classes = {TypeExcludeFilter.class}
), @Filter(
    type = FilterType.CUSTOM,
    classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {
   ......
}

从代码片段中可以看出,@SpringBootApplication 是一个复合型注解的接口,有一些默认接口方法,我们只关心三个注解,分别是:

  • @SpringBootConfiguration
  • @EnableAutoConfiguration
  • @ComponentScan

①. @SpringBootConfiguration :

@SpringBootConfiguration继承自@Configuration,二者功能也一致,标注当前类是配置类;JavaConfig形式的IOC配置类。

②. @EnableAutoConfiguration:

作用简而言之就是将符合条件的@Configuration加载到IOC容器中去,这个注解的幕后使者是SpringFactoriesLoader,这个类的功能是:从META-INF/Spring.factories加载配置

③.@ComponentScan:

自动扫描,ComponentScan做的事情就是告诉Spring从哪里找到bean;

例:@ComponentScan({"com.in28minutes.package1","com.in28minutes.package2"})
@Configuration
public class SpringConfiguration {
相比于xml:
<context:component-scan base-package="com.in28minutes.package1, com.in28minutes.package2" />

SpringApplication.run()的启动执行流程:

1. 实例化对象SpringApplication
2. 初始化对象,方法开始执行——>SpringFactoriesLoader加载——>SpringApplicationRunListener监听main方法的每个执行节点——>started()方法
3. 配置Enviroment(PropertySource及profile)
4. 创建ApplicationContext(ApplicationContext是Spring框架中一个很重要的接口,它扩展了BeanFactory,SpringBoot启动过程中,SpringApplication通常会选择合适的ApplicationContext实现类)
5. 遍历所有的SpringApplicationRunListener的contextPrepared()方法,通知ApplicationContext准备好了,可以进行下一步了
6. ★ 核心:将配置的@EnableAutoConfiguration获取所有配置及自定义的IOC,加载到准备完毕的ApplicationContext中去
7. ApplicationContext装填完毕后,调用refresh()方法,完成IOC的最后一道工序
8. 遍历执行SpringApplicationRunListener的finished()方法,到此SpringBoot启动完成。


相关文章
|
5月前
|
前端开发 Java 应用服务中间件
SpringBoot-Run启动流程
探索Spring Boot启动流程,从加载配置、创建应用上下文、自动配置到启动内嵌服务器。启动类是入口点,`@SpringBootApplication`标记启动,`SpringApplication.run`启动应用。自动配置基于条件注解配置Bean,应用上下文由`SpringApplication`创建并刷新。内嵌服务器如Tomcat随应用启动,简化部署。理解此流程有助于深入掌握Spring Boot。
206 2
|
5月前
|
缓存 Java 程序员
springboot的启动流程总结
springboot的启动流程总结
|
5月前
|
设计模式 Java 容器
SpringBoot2 | SpringBoot启动流程源码分析(二)
SpringBoot2 | SpringBoot启动流程源码分析(二)
76 0
|
5月前
|
设计模式 Java 机器人
SpringBoot3自动配置流程 SPI机制 核心注解 自定义starter
SpringBoot3自动配置流程 SPI机制 核心注解 自定义starter
|
18天前
|
前端开发 Java 数据安全/隐私保护
用户登录前后端开发(一个简单完整的小项目)——SpringBoot与session验证(带前后端源码)全方位全流程超详细教程
文章通过一个简单的SpringBoot项目,详细介绍了前后端如何实现用户登录功能,包括前端登录页面的创建、后端登录逻辑的处理、使用session验证用户身份以及获取已登录用户信息的方法。
71 2
用户登录前后端开发(一个简单完整的小项目)——SpringBoot与session验证(带前后端源码)全方位全流程超详细教程
|
4月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp小程序的销售项目流程化管理系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp小程序的销售项目流程化管理系统附带文章源码部署视频讲解等
63 3
|
10天前
|
NoSQL Java Redis
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。
这篇文章介绍了如何使用Spring Boot整合Apache Shiro框架进行后端开发,包括认证和授权流程,并使用Redis存储Token以及MD5加密用户密码。
16 0
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。
|
16天前
|
XML Java 应用服务中间件
【Spring】运行Spring Boot项目,请求响应流程分析以及404和500报错
【Spring】运行Spring Boot项目,请求响应流程分析以及404和500报错
101 2
|
11天前
|
JSON 前端开发 JavaScript
优雅!Spring Boot 3.3 实现职责链模式,轻松应对电商订单流程
本文介绍如何使用 Spring Boot 3.3 实现职责链模式,优化电商订单处理流程。通过将订单处理的各个环节(如库存校验、优惠券核验、支付处理等)封装为独立的处理器,并通过职责链将这些处理器串联起来,实现了代码的解耦和灵活扩展。具体实现包括订单请求类 `OrderRequest`、抽象处理器类 `OrderHandler`、具体处理器实现(如 `OrderValidationHandler`、`VerifyCouponHandler` 等)、以及初始化职责链的配置类 `OrderChainConfig`。
|
2月前
|
XML Java 应用服务中间件
SpringBoot启动流程解析
SpringBoot启动流程解析
39 0