springboot 启动原理、启动过程、启动机制的介绍

简介: 【5月更文挑战第13天】Spring Boot 是一种基于 Java 的框架,用于创建独立的、生产级别的 Spring 应用程序。它的主要目标是简化 Spring 应用的初始搭建和开发过程,同时提供一系列大型项目常见的非功能性特征(如嵌入式服务器、安全性、度量、健康检查和外部化配置)。

Spring Boot 是一种基于 Java 的框架,用于创建独立的、生产级别的 Spring 应用程序。它的主要目标是简化 Spring 应用的初始搭建和开发过程,同时提供一系列大型项目常见的非功能性特征(如嵌入式服务器、安全性、度量、健康检查和外部化配置)。以下是 Spring Boot 的一些核心原理:

启动原理

1. 自动配置

Spring Boot 的一个核心特点是其自动配置。它会自动配置 Spring 应用程序基于项目中添加的 jar 依赖。例如,如果项目中包括 spring-boot-starter-web 依赖,Spring Boot 将配置应用程序使用 Tomcat 作为默认服务器和将基本的 MVC 支持加入容器中。这是通过查看 classpath 和已定义的 beans 来决定配置类的自动应用来实现的,使用的是 @EnableAutoConfiguration 注解。

2. 起步依赖(Starters)

Spring Boot 的起步依赖是一组方便的依赖描述符,你可以在应用程序的 pom.xml 中添加它们。每一个起步依赖都旨在简化构建配置,提供所需的依赖。这让你能够在不担心版本冲突的情况下快速开始一个功能完备的开发环境。

3. 命令行界面(CLI)

Spring Boot 提供一个可选的 CLI(命令行界面),用于快速开发和原型制作 Spring 应用。CLI 使用 Spring 的 @* 注解进行编码,允许通过 Groovy 语言快速编写 Spring 应用。

4. 内嵌服务器

Spring Boot 内置了常见的服务器(如 Tomcat、Jetty 或 Undertow),无需复杂的服务器配置,只需一个简单的 main() 方法,即可将应用打包为单一的、可执行的 JAR 文件,这个 JAR 文件包含了一切必要的依赖、类和资源。

5. 外部化配置

Spring Boot 允许你通过外部配置(如 properties 文件、YAML 文件、环境变量和命令行参数)来管理应用程序的配置。这使得你的应用可以在不同环境中使用相同的代码,而不需要重新构建。

6. 监控和管理

Spring Boot Actuator 提供了许多生产级的特性,如监控和管理应用程序。它可以通过 HTTP 或 JMX 访问应用的内部状态。

7. 无代码生成和 XML 配置

Spring Boot 被设计为尽可能地减少显式配置。它使用条件注解来评估环境,自动配置 Spring 容器。Spring Boot 应用不需要使用 XML 配置,尽管可以选择使用 XML 来定义配置,但默认情况下,这种需求被最小化了。

通过以上原理,Spring Boot 实现了“约定大于配置”的软件设计范式,极大地简化了基于 Spring 的应用开发和服务部署。


启动过程:

Spring Boot 的启动机制设计得既简单又高效,这使得开发者能够迅速启动和运行一个独立的、生产级的应用程序。这一过程主要涉及以下几个核心步骤:

1. 启动入口

Spring Boot 应用的启动从一个包含 main() 方法的主类开始。这个主类会使用 SpringApplication.run() 方法来启动 Spring 应用。通常,这个类还带有 @SpringBootApplication 注解,它是一个组合注解,包含了 @SpringBootConfiguration@EnableAutoConfiguration@ComponentScan

2. 创建 SpringApplication 对象

当调用 SpringApplication.run() 时,首先会创建一个 SpringApplication 对象。这个对象负责管理 Spring 应用的启动和初始化。它会设置一些基础属性,比如是否应该添加命令行属性,是否需要横幅(Banner)等。

3. 运行 SpringApplication

接下来,SpringApplication 对象调用其 run() 方法。这个过程涉及多个重要步骤:

  • 初始化应用上下文:根据你选择的 web 环境类型(如 Servlet 或 Reactive),Spring Boot 设置合适的应用上下文(ApplicationContext)。
  • 环境准备:在应用上下文准备前,先准备环境(Environment),这包括配置文件、命令行参数、环境变量等的解析。
  • 横幅输出:如果启用,Spring Boot 的启动过程中会在控制台打印一个横幅。
  • 注册应用上下文初始化器和监听器:应用上下文初始化器(ApplicationContextInitializer)和应用事件监听器(ApplicationListener)会被加载和注册,它们可以在上下文的生命周期的不同阶段执行操作。
  • 加载 Bean 定义:通过扫描类路径中的组件和配置类(由 @ComponentScan@Configuration 等注解指定)来加载 Bean 定义。

4. 自动配置和 Bean 创建

  • 自动配置@EnableAutoConfiguration 注解激活了自动配置的魔法,它告诉 Spring Boot 基于添加到项目中的 jar 依赖,尝试去猜测并配置你可能需要的 Bean。自动配置类会在应用上下文中被条件化地执行。
  • Bean 实例化:在所有的配置类和组件被加载之后,Spring 容器会根据需要创建和配置 Bean 实例。

5. 运行应用上下文

  • 刷新应用上下文:完成所有配置后,应用上下文会被刷新,此时所有的 Bean 都已注册完毕,且已准备就绪。
  • 触发命令行运行器:如果应用中包含 CommandLineRunnerApplicationRunner Bean,它们会在此时执行。

6. 应用就绪

  • 触发应用就绪事件:最后,一个 ApplicationReadyEvent 被发布,表明应用已完全启动并准备好接收请求。

通过这种机制,Spring Boot 简化了传统 Spring 应用的配置复杂性,使开发者能够快速、轻松地部署和管理 Spring 应用。


Spring Boot 启动过程详解


Spring Boot 的启动过程是一个复杂而又精妙的流程,它负责加载配置、初始化应用上下文、自动配置和启动内嵌服务器等任务。下面详细解释了 Spring Boot 启动的每个步骤:

1. 加载主类

启动过程从加载包含 main() 方法的主类开始。这个主类通常使用 @SpringBootApplication 注解标记,它是一个组合注解,包含了 @SpringBootConfiguration@EnableAutoConfiguration@ComponentScan

2. 创建 SpringApplication 对象

在主类中调用 SpringApplication.run() 方法,会创建一个 SpringApplication 对象。这个对象负责管理 Spring 应用的启动和初始化。

3. 准备环境

SpringApplication 对象负责准备 Spring 应用的环境。这包括读取配置文件、解析命令行参数、收集系统环境变量等。这些环境属性将会被用于配置应用上下文和其他组件。

4. 创建应用上下文

SpringApplication 使用环境信息初始化 Spring 应用上下文(ApplicationContext)。根据应用是 Web 应用还是非 Web 应用,Spring Boot 会创建对应的应用上下文。

5. 加载 Bean 定义

应用上下文初始化后,Spring Boot 开始加载 Bean 的定义。它会扫描项目中的组件和配置类(由 @ComponentScan@Configuration 注解指定),并将它们注册到应用上下文中。

6. 自动配置

Spring Boot 的自动配置机制会根据项目中添加的 jar 依赖,尝试猜测并配置可能需要的 Bean。自动配置类会根据条件进行加载和执行,以确保配置的正确性和合理性。

7. Bean 实例化

所有配置类和组件被加载后,Spring 容器会根据需要创建和配置 Bean 实例。这些 Bean 可能是由 Spring Boot 提供的自动配置,也可能是开发者自定义的 Bean。

8. 刷新应用上下文

当所有 Bean 定义加载完毕后,应用上下文会被刷新。在这个阶段,Spring Boot 会执行一系列的初始化动作,确保所有 Bean 都被正确地创建和配置。

9. 运行应用

应用上下文初始化完成后,Spring Boot 将应用状态标记为“已启动”。此时,应用已准备就绪,可以处理请求和响应。

10. 触发生命周期事件

在应用启动过程中,Spring Boot 会触发一系列的生命周期事件,如应用启动事件、应用就绪事件等。开发者可以监听这些事件并执行相应的操作。

通过这些步骤,Spring Boot 实现了一个简洁而高效的启动过程,使得开发者能够快速启动和运行一个独立的、生产级的应用程序。

相关文章
|
5天前
|
消息中间件 缓存 Java
手写模拟Spring Boot启动过程功能
【11月更文挑战第19天】Spring Boot自推出以来,因其简化了Spring应用的初始搭建和开发过程,迅速成为Java企业级应用开发的首选框架之一。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,帮助读者深入理解其工作机制。
21 3
|
4天前
|
XML Java 开发者
Spring Boot开箱即用可插拔实现过程演练与原理剖析
【11月更文挑战第20天】Spring Boot是一个基于Spring框架的项目,其设计目的是简化Spring应用的初始搭建以及开发过程。Spring Boot通过提供约定优于配置的理念,减少了大量的XML配置和手动设置,使得开发者能够更专注于业务逻辑的实现。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,为开发者提供一个全面的理解。
15 0
|
8天前
|
Java Spring
SpringBoot自动装配的原理
在Spring Boot项目中,启动引导类通常使用`@SpringBootApplication`注解。该注解集成了`@SpringBootConfiguration`、`@ComponentScan`和`@EnableAutoConfiguration`三个注解,分别用于标记配置类、开启组件扫描和启用自动配置。
44 17
|
28天前
|
Java Spring 容器
springboot @RequiredArgsConstructor @Lazy解决循环依赖的原理
【10月更文挑战第15天】在Spring Boot应用中,循环依赖是一个常见问题,当两个或多个Bean相互依赖时,会导致Spring容器陷入死循环。本文通过比较@RequiredArgsConstructor和@Lazy注解,探讨它们解决循环依赖的原理和优缺点。@RequiredArgsConstructor通过构造函数注入依赖,使代码更简洁;@Lazy则通过延迟Bean的初始化,打破创建顺序依赖。两者各有优势,需根据具体场景选择合适的方法。
51 4
|
1月前
|
架构师 Java 开发者
得物面试:Springboot自动装配机制是什么?如何控制一个bean 是否加载,使用什么注解?
在40岁老架构师尼恩的读者交流群中,近期多位读者成功获得了知名互联网企业的面试机会,如得物、阿里、滴滴等。然而,面对“Spring Boot自动装配机制”等核心面试题,部分读者因准备不足而未能顺利通过。为此,尼恩团队将系统化梳理和总结这一主题,帮助大家全面提升技术水平,让面试官“爱到不能自已”。
得物面试:Springboot自动装配机制是什么?如何控制一个bean 是否加载,使用什么注解?
|
2月前
|
Java 应用服务中间件 API
Vertx高并发理论原理以及对比SpringBoot
Vertx 是一个基于 Netty 的响应式工具包,不同于传统框架如 Spring,它的侵入性较小,甚至可在 Spring Boot 中使用。响应式编程(Reactive Programming)基于事件模式,通过事件流触发任务执行,其核心在于事件流 Stream。相比多线程异步,响应式编程能以更少线程完成更多任务,减少内存消耗与上下文切换开销,提高 CPU 利用率。Vertx 适用于高并发系统,如 IM 系统、高性能中间件及需要较少服务器支持大规模 WEB 应用的场景。随着 JDK 21 引入协程,未来 Tomcat 也将优化支持更高并发,降低响应式框架的必要性。
Vertx高并发理论原理以及对比SpringBoot
|
2月前
|
Java 开发者 数据格式
【Java笔记+踩坑】SpringBoot基础4——原理篇
bean的8种加载方式,自动配置原理、自定义starter开发、SpringBoot程序启动流程解析
【Java笔记+踩坑】SpringBoot基础4——原理篇
|
3月前
|
Java 数据库 开发者
深入剖析 SpringBoot 的 SPI 机制
【8月更文挑战第10天】在软件开发中,SPI(Service Provider Interface)机制是一种重要的服务发现和加载机制,尤其在构建模块化、可扩展的系统时尤为重要。SpringBoot作为Spring家族的一员,其内置的SPI机制不仅继承了Java SPI的设计思想,还进行了优化和扩展,以适应Spring Boot特有的需求。本文将深入剖析SpringBoot中的SPI机制,揭示其背后的原理与应用。
85 7
|
3月前
|
Java 开发者 Spring
"揭秘SpringBoot魔法SPI机制:一键解锁服务扩展新姿势,让你的应用灵活飞天!"
【8月更文挑战第11天】SPI(Service Provider Interface)是Java的服务提供发现机制,用于运行时动态查找和加载服务实现。SpringBoot在其基础上进行了封装和优化,通过`spring.factories`文件提供更集中的配置方式,便于框架扩展和组件替换。本文通过定义接口`HelloService`及其实现类`HelloServiceImpl`,并在`spring.factories`中配置,结合`SpringFactoriesLoader`加载服务,展示了SpringBoot SPI机制的工作流程和优势。
57 5
|
3月前
|
安全 Java UED
掌握SpringBoot单点登录精髓,单点登录是一种身份认证机制
【8月更文挑战第31天】单点登录(Single Sign-On,简称SSO)是一种身份认证机制,它允许用户只需在多个相互信任的应用系统中登录一次,即可访问所有系统,而无需重复输入用户名和密码。在微服务架构日益盛行的今天,SSO成为提升用户体验和系统安全性的重要手段。本文将详细介绍如何在SpringBoot中实现SSO,并附上示例代码。
75 0