SpringBoot高级-底层原理

news2024/10/24 23:25:13

SpringBoot高级-底层原理

SpringBoot是一个基于Spring的快速开发框架,它极大地简化了Spring应用程序的配置和部署过程,使得开发人员能够更加专注于业务逻辑的实现。本文将深入探讨SpringBoot的底层原理,包括其核心组件、启动流程、自动化配置、条件化配置、外部化配置以及依赖管理等关键方面。

一、SpringBoot的核心组件

SpringBoot的核心组件主要包括以下几个方面:

  1. @SpringBootApplication注解

    @SpringBootApplication是一个复合注解,它结合了@Configuration、@EnableAutoConfiguration和@ComponentScan三个注解的功能。这个注解通常被用在主启动类上,用于开启SpringBoot的自动配置和组件扫描。

    • @Configuration:表示该类是一个配置类,相当于传统的Spring XML配置文件。在配置类中,可以通过@Bean注解来定义和注册Bean。
    • @EnableAutoConfiguration:告诉SpringBoot根据添加的jar依赖来自动配置项目。例如,如果添加了spring-boot-starter-web依赖,SpringBoot会自动配置Tomcat和Spring MVC。
    • @ComponentScan:让SpringBoot自动扫描当前包及其子包中的@Component、@Repository、@Service、@Controller等注解的类,并将它们注册为Bean。
  2. SpringApplication类

    SpringApplication类是SpringBoot的启动类,它负责启动整个Spring应用上下文。在main方法中,通过调用SpringApplication.run(Application.class, args)方法来启动SpringBoot应用。

    SpringApplication的启动过程包括以下几个步骤:

    • 初始化监听器,并添加自定义的监听器。
    • 发布ApplicationStartedEvent事件。
    • 装配参数和环境,确定应用是Web环境还是非Web环境。
    • 触发ApplicationEnvironmentPreparedEvent事件。
    • 如果设置了打印Banner,则打印启动Banner。
    • 创建ApplicationContext,根据是否是Web环境来决定创建什么类型的ApplicationContext。
    • 装配Context的环境变量,注册Initializers、beanNameGenerator等。
    • 发布ApplicationPreparedEvent事件。
    • 注册springApplicationArguments、springBootBanner,加载资源等。
    • 遍历调用所有SpringApplicationRunListener的contextLoaded()方法。
    • 调用ApplicationContext的refresh()方法,装配context、beanfactory等核心组件。
    • 查找当前ApplicationContext中是否注册有CommandLineRunner,如果有,则遍历执行它们。
    • 发布ApplicationReadyEvent事件,表示服务已经可以开始正常提供服务了。
二、SpringBoot的启动流程

SpringBoot的启动流程可以概括为以下几个步骤:

  1. 读取配置文件

    SpringBoot默认会在resources文件夹下读取application.properties或application.yml配置文件,这些配置文件包含了应用的各种配置信息,如数据库连接信息、服务器端口等。

  2. 初始化Spring应用上下文

    在main方法中,通过调用SpringApplication.run(Application.class, args)方法来初始化Spring应用上下文。这个过程包括装配参数和环境、创建ApplicationContext、注册各种组件等。

  3. 自动配置

    SpringBoot会根据添加的jar依赖和配置文件中的信息来自动配置项目。这个过程是通过@EnableAutoConfiguration注解来实现的,它会根据类路径中的jar依赖为项目进行自动配置。

  4. 组件扫描和Bean注册

    @ComponentScan注解会让SpringBoot自动扫描当前包及其子包中的注解类,并将它们注册为Bean。这些Bean会被存储在Spring的IoC容器中,供后续使用。

  5. 应用启动和监听事件

    在SpringBoot启动过程中,会发布多个事件,如ApplicationStartedEvent、ApplicationEnvironmentPreparedEvent、ApplicationPreparedEvent和ApplicationReadyEvent等。这些事件可以被自定义的监听器捕获和处理,以实现一些自定义的启动逻辑。

三、SpringBoot的自动化配置

SpringBoot的自动化配置是其核心特性之一,它极大地简化了Spring应用程序的配置过程。自动化配置的实现主要依赖于以下几个方面:

  1. starter依赖

    starter依赖是SpringBoot提供的一组预定义的依赖集合,它们包含了常用的库和框架的依赖关系。开发人员只需要在项目中添加相应的starter依赖,就可以快速构建出一个功能完整的应用程序。starter依赖不仅简化了项目的依赖管理,还包含了很多默认的配置信息,进一步简化了配置工作。

  2. 自动配置类

    SpringBoot会根据添加的jar依赖来自动配置相应的自动配置类。这些自动配置类通常位于spring-boot-autoconfigure模块中,它们会根据配置文件和类路径中的jar依赖来自动配置项目的各种组件。

  3. 条件化配置

    SpringBoot使用条件化配置来根据运行时环境和配置条件来决定是否启用某个组件或功能。条件化配置是通过@Conditional注解来实现的,它可以根据配置文件、系统属性、环境变量等条件来动态地配置应用程序。

四、SpringBoot的条件化配置

条件化配置是SpringBoot的另一个重要特性,它允许开发人员根据运行时环境和配置条件来动态地配置应用程序。条件化配置的实现主要依赖于@Conditional注解及其各种派生注解,如@ConditionalOnBean、@ConditionalOnClass、@ConditionalOnMissingBean等。

  1. @Conditional注解

    @Conditional注解是一个通用的条件注解,它可以根据指定的条件来决定是否创建某个Bean。开发人员可以通过实现Condition接口来定义自己的条件逻辑。

  2. @ConditionalOnBean和@ConditionalOnMissingBean

    @ConditionalOnBean和@ConditionalOnMissingBean注解分别用于在存在或不存在某个Bean时创建另一个Bean。这两个注解常用于在自动配置类中根据条件来注册或替换Bean。

  3. @ConditionalOnClass和@ConditionalOnMissingClass

    @ConditionalOnClass和@ConditionalOnMissingClass注解分别用于在类路径中存在或不存在某个类时创建另一个Bean。这两个注解常用于根据类路径中的jar依赖来自动配置项目。

五、SpringBoot的外部化配置

SpringBoot支持将应用程序的配置信息外部化,即将配置信息存储在外部的配置文件、环境变量或命令行参数中。这样做的好处是使得应用程序的配置更加灵活和可维护,便于在不同环境中进行部署和配置。

  1. 配置文件

    SpringBoot默认会在resources文件夹下读取application.properties或application.yml配置文件。这些配置文件可以包含各种配置信息,如数据库连接信息、服务器端口、日志级别等。

  2. 环境变量和命令行参数

    SpringBoot还支持通过环境变量和命令行参数来配置应用程序。环境变量通常以"SPRING_"为前缀,而命令行参数则可以直接在启动命令中指定。

  3. 配置文件的优先级

    SpringBoot会根据配置文件的优先级来加载配置信息。通常,优先级从高到低依次为:命令行参数、application.properties(或application.yml)中的配置、默认配置。如果多个配置文件中存在相同的配置项,则优先级高的配置文件中的配置项会覆盖优先级低的配置文件中的配置项。

六、SpringBoot的依赖管理

SpringBoot通过Maven或Gradle等构建工具来管理项目的依赖关系。它提供了一系列的starter依赖来简化项目的依赖管理,并使用了依赖管理和版本控制的功能来确保项目中使用的是兼容和稳定的库和框架版本。

  1. starter依赖

    starter依赖是SpringBoot提供的一组预定义的依赖集合,它们包含了常用的库和框架的依赖关系。开发人员只需要在项目中添加相应的starter依赖,就可以快速构建出一个功能完整的应用程序。starter依赖不仅简化了项目的依赖管理,还包含了很多默认的配置信息,进一步简化了配置工作。

  2. 依赖管理和版本控制

    SpringBoot使用了Maven或Gradle的依赖管理和版本控制功能来确保项目中使用的是兼容和稳定的库和框架版本。在Maven中,可以通过在pom.xml文件中添加标签来统一管理项目的依赖版本;在Gradle中,则可以通过在build.gradle文件中添加ext属性来定义依赖的版本号。

  3. 自定义starter

    除了使用SpringBoot提供的官方starter依赖外,开发人员还可以根据自己的需求创建自定义的starter依赖。自定义starter依赖通常包含一些通用的配置和组件,并可以通过@ConfigurationProperties注解来支持自定义的配置项。

七、总结与展望

SpringBoot作为一个基于Spring的快速开发框架,通过其底层原理中的核心组件、启动流程、自动化配置、条件化配置、外部化配置以及依赖管理等关键特性,极大地简化了Spring应用程序的配置和部署过程。然而,随着技术的不断发展和应用场景的不断拓展,SpringBoot也面临着一些新的挑战和机遇。例如,如何更好地支持微服务架构、如何进一步提高应用的性能和可扩展性、如何更好地集成新兴的技术和框架等。因此,在未来的发展中,我们需要不断探索和创新,以推动SpringBoot的不断进步和完善。

同时,对于开发人员来说,深入了解SpringBoot的底层原理也是非常重要的。这不仅可以帮助我们更好地理解和使用SpringBoot框架,还可以提高我们的开发效率和代码质量。因此,建议开发人员在学习SpringBoot的过程中,不仅要掌握其使用方法和最佳实践,还要深入理解其底层原理和实现机制。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python装饰器的另类用法

在对pyverilog源码进行单步调试时,遇到一个很奇怪的现象,被装饰器装饰的方法t_LINECOMMENT没有主动调用,但装饰器TOKEN中的内嵌函数set_regex却被调用了。 ## lexer.pyfrom ply.lex import *class VerilogLexer(object):linecomment r"…

C++【string类的使用】(上)

文章目录 1. 为什么要学习string类2. 标准库的string类2.1 string的构造函数(1)无参构造(重点)(2)用字符串初始化(重点)(3)用字符串的前n个字符初始化(4)拷贝…

常见ElasticSearch 面试题解析(上)

前言 ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。ElasticSearch…

直播间“饕餮盛宴”的背后,是“他经济”正在冒头

最近,一个有意思的现象逐渐露出了苗头。 今年“双11”第一轮尾款开启支付的当晚,罗永浩的直播间上演了一出别样的“饕餮盛宴”。直播开场后,iphone16系列、可口可乐(含糖、无糖300ml)10秒售罄,索尼PS5、沃…

hive on tez 指定队列后任务一直处于running状态

如上图所示一直处于running状态&#xff0c;查看日志发现一直重复弹出同一个info&#xff1a; 2024-10-18 16:57:32,739 [INFO] [AMRM Callback Handler Thread] |rm.YarnTaskSchedulerService|: Allocated: <memory:0, vCores:0> 释义: 当前应用程序没有分配到任何内存…

wordcloud 字体报错

wordcloud 字体报错 词云库报错&#xff1a;Only supported for TrueType fonts字体文件问题pillow版本的问题wordcloud版本问题&#xff08;我的最终解决方案&#xff09; 词云库报错&#xff1a;Only supported for TrueType fonts 字体文件问题 解决方法 写绝对路径 &…

教程分享!超简单的低功耗4G模组LCD应用示例!看过来~

低功耗4G模组LCD应用是物联网技术中的一部分知识&#xff0c;在未来的学习和实践中&#xff0c;我们还将接触到更多前沿的技术和理念。让我们一起努力&#xff0c;探索科技的无限可能&#xff0c;为我们的生活带来更多便利与惊喜&#xff01;希望本文能为您提供一些帮助&#x…

Cisco WLC 9800 - HA SSO with Ether-channel

本文将记录如何配置HA SSO以及Ethernet Channel。 1.拓扑情况 本文的内容基于如下的Topo进行。 2.准备工作 两台WLC的型号必须一样&#xff1b;两台WLC必须使用一样的软件版本&#xff1b;需要准备好使用的IP地址&#xff1a;两个用于WLC的管理地址&#xff08;WMI&#xff…

串口通讯编程示例之串口编写程序

使用open()函数打开串口设备 首先使用open()函数打开串口设备/dev/ttymxc6&#xff0c;设备使用了O_RDWR | O_NOCTTY | O_NDELAY标志&#xff0c;分别代表以读写方式打开、不让设备成为控制终端且设置非阻塞模式&#xff0c;也就是当无法打开设备时&#xff0c;不会在原地等待&…

【博客节选】Unity角色异常抖动问题排查

本文截取自本人文章 &#xff1a;【Unity实战笔记】第二一 基于状态模式的角色控制——以UnityChan为例 发现出现角色抖动问题 尝试解决方法&#xff1a; 跳跃的loop time不要勾选&#xff1b; 相机aim添加垂直阻尼 还是不行&#xff0c;仔细查看是位移时震颤。 UnityCha…

HCIP-HarmonyOS Application Developer 习题(十三)

&#xff08;多选&#xff09;1、在设计应用框架的过程中&#xff0c;我们常用的界面应用框架有哪些? A、启动页 B、详情页 C、列表视图 D、网格视图 答案&#xff1a;ABCD 分析&#xff1a; &#xff08;多选&#xff09;2、触摸屏以触控的方式进行输入。它可以支持以下哪些…

OpenIPC开源FPV之Ardupilot配置

OpenIPC开源FPV之Ardupilot配置 1. 源由2. 问题3. 分析3.1 MAVLINK_MSG_ID_RAW_IMU3.2 MAVLINK_MSG_ID_SYS_STATUS3.3 MAVLINK_MSG_ID_BATTERY_STATUS3.4 MAVLINK_MSG_ID_RC_CHANNELS_RAW3.5 MAVLINK_MSG_ID_GPS_RAW_INT3.6 MAVLINK_MSG_ID_VFR_HUD3.7 MAVLINK_MSG_ID_GLOBAL_P…

千万不要小看SD3.5!最强模型全家桶来了!

一、SD3.5 的登场 Stability AI 推出的 SD3.5 引起了广泛关注。它直接开源了三个模型&#xff0c;包括 Large 和 Large Turbo&#xff0c;Medium 将于 29 号发布&#xff0c;并且这三个型号都可以商用。 &#xff08;一&#xff09;模型版本介绍 模型版本参数量特点分辨率范围S…

《A complete telomere-to-telomere assembly of the maize genome》方法总结

研究背景 完整的T2T基因组组装一直是基因组研究的长期追求。 研究方法 通过生成高深度覆盖的超长 Oxford Nanopore Technology (ONT) 和 PacBio HiFi 测序数据&#xff0c;报道了玉米的完整基因组组装。 每条染色体均以单一contig的形式完整覆盖。 结果概述 基因组特征&am…

vue3中mitt和pinia的区别和主要用途,是否有可重合的部分?

在 Vue 中&#xff0c;Mitt 和 Pinia 是两个不同的工具&#xff0c;它们的主要用途和功能有所不同&#xff0c;但在某些方面也存在重合的部分。 区别 Mitt&#xff1a; Mitt 是一个简单而强大的事件总线库&#xff0c;用于在组件之间进行事件的发布和订阅。 它提供了一种简洁…

【Linux】实现一个简易的shell命令行

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:Linux ⚙️操作环境:Xshell (操作系统:Ubuntu 22.04 server 64bit) 目录 一.项目简介 二.分析项目实现 三.逐步实现项目功能 1.获取命令行 2.解析命令行 3.指令的判断 4.普通命令的执行 四.完整项目代码 结语 一.项目简介…

计算生物学与生物信息学漫谈-1-测序一路走来

最近工作中&#xff0c;反思自己计算生物学基础非常薄弱&#xff0c;然而作为一门非常新兴的交叉学科&#xff0c;涉及计算机、物理、生物、数学等多多学科&#xff0c;国内并没有这样完善的教程&#xff0c;因此想要自己做一个教程&#xff0c;使用费曼学习法学习&#xff0c;…

【亚马逊云】基于 Amazon EKS 搭建开源向量数据库 Milvus

文章目录 一、先决条件1.1 安装AWS CLI ✅1.2 安装 EKS 相关工具✅1.3 创建 Amazon S3 存储桶✅1.4 创建 Amazon MSK 实例✅ 二、创建EKS集群三、创建 ebs-sc StorageClass四、安装 AWS Load Balancer Controller五、部署 Milvus 数据库5.1 添加 Milvus Helm 仓库5.2 配置 S3 作…

Vue2、Element中实现Enter模拟Tab,实现切换下一个框的效果

目录 &#x1f4c3;前序 &#x1f449;开发历程 &#x1f4bb;实际代码 &#x1f4fd;实现效果图 前序 在几乎所有的浏览器中&#xff0c;都具备通过 Tab 键来切换焦点的功能。然而&#xff0c;有些用户提出了强烈要求&#xff0c;希望能够增加通过 Enter 键…

进程间通信(二)消息队列、共享内存、信号量

文章目录 进程间通信System V IPC概述System V IPC 对象的访问消息队列示例--使用消息队列实现进程间的通信 共享内存示例--使用共享内存实现父子进程间的通信&#xff08;进程同步&#xff09;示例--使用进程实现之前的ATM案例&#xff08;进程互斥&#xff09; 信号量示例--利…