SpringBoot的工作原理

Spring Boot 旨在简化 Spring 应用的开发、配置和部署,它通过约定优于配置的方式,提供了许多自动化配置和启动依赖,使得开发者可以专注于业务逻辑的开发。

核心概念:

  • 约定优于配置 (Convention over Configuration): Spring Boot 推崇遵循预定义的约定,这样开发者无需进行大量的配置。框架会根据约定自动推断需要的配置,从而减少了配置文件的编写。

  • 启动依赖 (Starter Dependencies): Spring Boot 提供了许多启动依赖,它们是一组相关的依赖项的集合,方便开发者快速引入所需的功能模块,例如 Web、JPA、Security 等。

  • 自动配置 (Auto-Configuration): Spring Boot 会根据项目中的依赖和环境条件,自动配置 Spring 应用。它会检测类路径上的依赖项,并根据这些依赖项自动创建和配置 Bean。

  • 嵌入式服务器 (Embedded Server): Spring Boot 内置了常用的服务器,例如 Tomcat、Jetty 和 Undertow。开发者无需手动部署 WAR 文件到外部服务器,可以直接运行 Spring Boot 应用。

  • Actuator: 提供监控和管理 Spring Boot 应用的功能,例如健康检查、指标收集、审计等。

工作流程:

  1. 项目启动:

    • 当 Spring Boot 应用启动时,SpringApplication.run() 方法会被调用。这是 Spring Boot 应用的入口点。
    • SpringApplication 类会执行一系列的初始化操作,包括设置应用上下文、配置环境、加载配置等。
    • SpringApplication 首先创建一个 ApplicationContext,该上下文是 Spring Framework 的核心,负责管理 Bean 的生命周期和依赖关系。
  2. 自动配置:

    • Spring Boot 的自动配置功能是通过 spring.factories 文件实现的。该文件位于 META-INF 目录下,其中包含了自动配置类的列表。
    • @EnableAutoConfiguration 注解是触发自动配置的关键。它会扫描类路径下的 spring.factories 文件,并加载其中的自动配置类。
    • 自动配置类通常使用 @Configuration 注解进行标记,并且使用 @Conditional 注解来控制是否启用配置。@Conditional 注解可以根据类路径、Bean 的存在、环境变量等条件来决定是否创建 Bean。
    • 自动配置类会创建和配置 Spring Bean,例如数据源、消息队列、Web 服务器等。
    • 例如,如果项目中引入了 spring-boot-starter-web 依赖,Spring Boot 会自动配置 Spring MVC 的相关组件,例如 DispatcherServletViewResolver 等。
  3. 组件扫描:

    • Spring Boot 会自动扫描带有 @Component@Service@Repository@Controller 等注解的类,并将它们注册为 Spring Bean。
    • @ComponentScan 注解用于指定扫描的包路径。如果没有指定,Spring Boot 会默认扫描启动类所在的包及其子包。
  4. 配置加载:

    • Spring Boot 支持多种配置方式,包括 properties 文件、YAML 文件、环境变量、命令行参数等。
    • Spring Boot 会按照一定的优先级顺序加载配置,例如命令行参数的优先级高于 properties 文件。
    • @ConfigurationProperties 注解可以将配置文件的属性绑定到 Java Bean 上,方便开发者使用配置。
  5. 嵌入式服务器启动:

    • 如果项目中引入了 spring-boot-starter-web 依赖,Spring Boot 会自动启动嵌入式服务器,例如 Tomcat。
    • 开发者无需手动配置服务器,Spring Boot 会自动完成服务器的初始化和启动。
  6. 应用运行:

    • 当 Spring Boot 应用启动完成后,就可以接收和处理请求了。
    • Spring MVC 会根据请求的 URL 找到对应的 Controller,并执行相应的处理方法。
    • 应用可以通过访问数据库、调用外部服务等方式来完成业务逻辑。

详细步骤分解:

  1. SpringApplication.run() 启动流程:

    • 创建 SpringApplication 实例:

      • 检测应用类型(Web 应用、非 Web 应用等)。
      • 查找并设置应用的 ApplicationContextInitializer
      • 查找并设置应用的 ApplicationListener
    • 准备 ApplicationContext

      • 根据应用类型创建合适的 ApplicationContext (例如:AnnotationConfigServletWebServerApplicationContext for web apps)。
      • 配置 ApplicationContext 的环境 (Environment)。
      • 将 Spring Boot 的 Banner 打印到控制台(可自定义)。
    • 执行 ApplicationContextInitializer

      • 允许在 ApplicationContext 刷新之前进行自定义初始化。
    • 加载配置:

      • 加载 application.propertiesapplication.yml 文件中的配置。
      • 处理命令行参数。
      • 将配置信息绑定到 Spring 的 Environment 中。
    • 刷新 ApplicationContext

      • 这是最关键的步骤,触发 Spring 容器的初始化。
      • 注册 Bean 定义,创建 Bean 实例,处理 Bean 依赖关系。
      • 应用自动配置,根据条件创建和配置 Bean。
    • 启动嵌入式服务器:

      • 如果应用是 Web 应用,则启动嵌入式服务器(Tomcat、Jetty、Undertow)。
    • 执行 ApplicationRunnerCommandLineRunner

      • 允许在应用启动后执行一些初始化任务。
  2. 自动配置机制深入:

    • @EnableAutoConfiguration 注解:

      • 启用自动配置功能。
      • 通过 @Import(AutoConfigurationImportSelector.class) 导入 AutoConfigurationImportSelector 类。
    • AutoConfigurationImportSelector

      • 负责查找所有可用的自动配置类。
      • META-INF/spring.factories 文件中读取自动配置类的列表。
      • 根据条件判断是否应该启用某个自动配置类。
    • @Conditional 注解:

      • 用于控制自动配置类的启用条件。
      • 常见的条件包括:
        • @ConditionalOnClass:类路径中存在指定的类。
        • @ConditionalOnMissingBean:容器中不存在指定的 Bean。
        • @ConditionalOnProperty:指定的属性存在且满足条件。
    • 自动配置类:

      • 通常使用 @Configuration 注解标记。
      • 使用 @Bean 注解定义 Bean。
      • 使用 @ConfigurationProperties 注解将配置文件的属性绑定到 Bean 上。
  3. 启动依赖 (Starter Dependencies) 的作用:

    • 简化依赖管理:将一组相关的依赖项打包在一起,方便开发者引入所需的功能模块。
    • 提供默认配置:启动依赖通常会包含默认的配置,减少了开发者需要编写的配置代码。
    • 版本管理:起步依赖会管理依赖项的版本,避免版本冲突。
  4. Actuator 的作用:

    • 提供监控和管理 Spring Boot 应用的功能。
    • 可以通过 HTTP 端点访问 Actuator 提供的信息。
    • 常用的 Actuator 端点包括:
      • /health:健康检查。
      • /metrics:指标收集。
      • /info:应用信息。
      • /beans:Bean 信息。
      • /env:环境变量。
      • /loggers:日志配置。

总结:

Spring Boot 通过约定优于配置、启动依赖和自动配置等机制,简化了 Spring 应用的开发、配置和部署。开发者可以专注于业务逻辑的开发,而无需花费大量时间在配置上。Spring Boot 还提供了 Actuator 等功能,方便开发者监控和管理应用。掌握 Spring Boot 的工作原理,可以帮助开发者更好地理解和使用 Spring Boot。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/13838.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

初窥强大,AI识别技术实现图像转文字(OCR技术)

⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ 🐴作者:秋无之地 🐴简介:CSDN爬虫、后端、大数据、人工智能领域创作者。目前从事python全栈、爬虫和人工智能等相关工作,主要擅长领域有:python…

如何在Docker中运行MySQL容器?

随着容器化技术的普及,Docker已成为开发和部署应用的首选工具之一。MySQL作为最流行的开源关系型数据库,也非常适合在Docker容器中运行。本文将介绍如何在Docker中运行MySQL容器,帮助你快速搭建一个可用的数据库环境。 1. 安装Docker 首先&a…

[ESP32:Vscode+PlatformIO]添加第三方库 开源库 与Arduino导入第三方库的区别

前言 PlatformIO与Arduino在添加第三方库方面的原理存在显著差异 在PlatformIO中,第三方库的使用是基于项目(工程)的。具体而言,只有当你为一个特定的项目添加了某个第三方库后,该项目才能使用该库。这些第三方库的文…

高端入门:Ollama 本地高效部署DeepSeek模型深度搜索解决方案

目录 一、Ollama 介绍 二、Ollama下载 2.1 官网下载 2.2 GitHub下载 三、模型库 四、Ollmal 使用 4.1 模型运行(下载) 4.2 模型提问 五、Ollama 常用命令 相关推荐 一、Ollama 介绍 Ollama是一个专为在本地机器上便捷部署和运行大型语言模型&…

【DeepSeek论文精读】2. DeepSeek LLM:以长期主义扩展开源语言模型

欢迎关注[【youcans的AGI学习笔记】](https://blog.csdn.net/youcans/category_12244543.html)原创作品 【DeepSeek论文精读】1. 从 DeepSeek LLM 到 DeepSeek R1 【DeepSeek论文精读】2. DeepSeek LLM:以长期主义扩展开源语言模型 【DeepSeek论文精读】…

力扣.623. 在二叉树中增加一行(链式结构的插入操作)

Problem: 623. 在二叉树中增加一行 文章目录 题目描述思路复杂度Code 题目描述 思路 1.首先要说明,对于数据结构无非两大类结构:顺序结构、链式结构,而二叉树实质上就可以等效看作为一个二叉链表,而对于链表插入一个节点的操作是应…

深度学习01 神经网络

深度学习是机器学习领域中的一个新的研究方向。所以在学习深度学习之前我们需要了解一下神经网络。 神经网络 神经网络:是由大量的节点(或称“神经元”)和之间相互的联接构成。 每个节点代表一种特定的输出函数,称为激励函数、激活函数&…

基于JUnit4和JUnit5配合例子讲解JUnit的两种运行方式

1 引言 最近读的书有老有新,在读的过程中都完全完成了相应例子的构建和运行。在读《Spring in Action》1第4版时,其第37页的例子(以下称例子1)基于JUnit 4,并需要spring-test.jar;而在读《JUnit in Action…

【提示词工程】探索大语言模型的参数设置:优化提示词交互的技巧

在与大语言模型(Large Language Model, LLM)进行交互时,提示词的设计和参数设置直接影响生成内容的质量和效果。无论是通过 API 调用还是直接使用模型,掌握模型的参数配置方法都至关重要。本文将为您详细解析常见的参数设置及其应用场景,帮助您更高效地利用大语言模型。 …

使用Python创建、读取和修改Word文档

自动化文档处理是提升工作效率的关键路径之一,而Python凭借其简洁语法和丰富的生态工具链,是实现文档自动化处理的理想工具。通过编程手段批量生成结构规范的合同模板、动态注入数据分析结果生成可视化报告,或是快速提取海量文档中的关键信息…

Android Studio 2024.2.2.13版本安装配置详细教程

Android Studio 是由 Google 官方开发和维护的集成开发环境(IDE),专为 Android 应用开发设计。它是基于 JetBrains 的 IntelliJ IDEA 平台构建的,集成了丰富的工具和功能,帮助开发者高效构建、调试、测试和发布 Androi…

Qt实现简易音乐播放器

使用Qt6实现简易音乐播放器,效果如下: github: Gabriel-gxb/MusicPlayer: qt6实现简易音乐播放器 一、整体架构 基于Qt框架构建 整个音乐播放器程序以Qt框架为基础进行开发。Qt提供了丰富的类库和工具,方便开发者构建图形用户界…

GPT-4使用次数有上限吗?一文了解使用规则

GPT-4的推出,让越来越多的用户开始体验其卓越的功能。无论是用于日常需求还是专业内容制作,GPT-4的应用范围广泛,获得了用户的广泛赞誉。但是,在具体使用过程中,不少用户发现自己似乎触碰到了GPT-4的使用上限&#xff…

水波效果

水波效果指在计算机图形学中模拟水面波纹的视觉效果,通常用于游戏、动画或者其他虚拟场景中。主要用于体现水体的动态感,比如水的波动、反射、折射、透明等,可以让人感觉像真实的水一样流动闪耀。 核心特点就是: 动态波纹光学特…

Redis | 十大数据类型

文章目录 十大数据类型概述key操作命令数据类型命令及落地运用redis字符串(String)redis列表(List)redis哈希表(Hash)redis集合(Set)redis有序集合(ZSet / SortedSet&…

Linux之安装docker

一、检查版本和内核是否合格 Docker支持64位版本的CentOS 7和CentOS 8及更高版本,它要求Linux内核版本不低于3.10。 检查版本 cat /etc/redhat-release检查内核 uname -r二、Docker的安装 1、自动安装 Docker官方和国内daocloud都提供了一键安装的脚本&#x…

【WebLogic】Oracle发布WebLogic 14c最新版本-14.1.2.0

根据Oracle官方产品经理的博客,Oracle于2024年12月20日正式对外发布了WebLogic 14c的第二个正式版本,版本号为 14.1.2.0.0 ,目前官方已开放客户端下载。该版本除继续支持 Jakarta EE 8 版本外,还增加了对 Java SE 17(J…

feign 远程调用详解

在平常的开发工作中,我们经常需要跟其他系统交互,比如调用用户系统的用户信息接口、调用支付系统的支付接口等。那么,我们应该通过什么方式进行系统之间的交互呢?今天,简单来总结下 feign 的用法。 1:引入依…

解决 npm : 无法加载文件 D:\nodeJS\node_global\npm.ps1,因为在此系统上禁止运行脚本。

问题 在我将nodeJS从18更新到22之后,我发现在黑窗口运行npm run dev,可以成功启动项目,但是在Cursor的终端中却报如下错误: PS D:\DESKTOP\项目\vue-ems-admain> npm run dev npm : 无法加载文件 D:\Users\Download\nodeJS\no…

快速对QWen2.5大模型进行微调

先看看训练结果: 目录 前言什么是LLaMA-Factory?安装LLaMA-Factory准备数据集配置微调参数运行微调脚本评估和保存模型使用微调后的模型可视化微调大模型总结 前言 在当今人工智能领域,大模型(如LLaMA、GPT等)的微调…