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 实现了一个简洁而高效的启动过程,使得开发者能够快速启动和运行一个独立的、生产级的应用程序。

相关文章
|
1月前
|
Java 应用服务中间件 开发者
Java面试题:解释Spring Boot的优势及其自动配置原理
Java面试题:解释Spring Boot的优势及其自动配置原理
87 0
|
8天前
|
Java 数据库 开发者
深入剖析 SpringBoot 的 SPI 机制
【8月更文挑战第10天】在软件开发中,SPI(Service Provider Interface)机制是一种重要的服务发现和加载机制,尤其在构建模块化、可扩展的系统时尤为重要。SpringBoot作为Spring家族的一员,其内置的SPI机制不仅继承了Java SPI的设计思想,还进行了优化和扩展,以适应Spring Boot特有的需求。本文将深入剖析SpringBoot中的SPI机制,揭示其背后的原理与应用。
26 7
|
8天前
|
Java 开发者 Spring
"揭秘SpringBoot魔法SPI机制:一键解锁服务扩展新姿势,让你的应用灵活飞天!"
【8月更文挑战第11天】SPI(Service Provider Interface)是Java的服务提供发现机制,用于运行时动态查找和加载服务实现。SpringBoot在其基础上进行了封装和优化,通过`spring.factories`文件提供更集中的配置方式,便于框架扩展和组件替换。本文通过定义接口`HelloService`及其实现类`HelloServiceImpl`,并在`spring.factories`中配置,结合`SpringFactoriesLoader`加载服务,展示了SpringBoot SPI机制的工作流程和优势。
20 5
WXM
|
16天前
|
存储 缓存 Java
|
22天前
|
SQL Java 数据库连接
springboot~mybatis-pagehelper原理与使用
【7月更文挑战第15天】MyBatis-PageHelper是用于MyBatis的分页插件,基于MyBatis的拦截器机制实现。它通过在SQL执行前动态修改SQL语句添加LIMIT子句以支持分页。使用时需在`pom.xml`添加依赖并配置方言等参数。示例代码: PageHelper.startPage(2, 10); List<User> users = userMapper.getAllUsers(); PageInfo<User> pageInfo = new PageInfo<>(users); 这使得分页查询变得简单且能获取总记录数等信息。
|
2天前
|
设计模式 缓存 Java
深入Spring Boot启动过程:揭秘设计模式与代码优化秘籍
深入Spring Boot启动过程:揭秘设计模式与代码优化秘籍
|
5天前
|
消息中间件 Java Kafka
SpringBoot Kafka SSL接入点PLAIN机制收发消息
SpringBoot Kafka SSL接入点PLAIN机制收发消息
12 0
|
1月前
|
安全 Java API
构建基于Spring Boot的REST API安全机制
构建基于Spring Boot的REST API安全机制
|
1月前
|
Java 开发者 Spring
深入理解Spring Boot中的自动配置原理
深入理解Spring Boot中的自动配置原理
|
1月前
|
开发框架 Java 开发者
Spring Boot中的自动装配原理
Spring Boot中的自动装配原理