Spring Boot 快速入门2 ——SpringBoot运行原理分析

news2025/1/18 2:06:18

一、SpringBoot运行原理

父依赖

我们再查看 Spring Boot 项目中 pom.xml 可以看出,所有的 Spring Boot 项目 直接或间接的 依赖于一个 父项目  spring-boot-starter-parent  ,主要是管理项目的资源及其插件。

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.2.5.RELEASE</version>
    <relativePath/> 
</parent>

进入到spring-boot-starter-parent,发现还有一个父依赖:

这个才是真正管理 Spring Boot 应用中所有依赖版本的地方,Spring Boot 的版本控制中心。

我们在导入依赖的时候,默认不需要写版本号,就是因为版本控制中心,但是如果导入的包没有在依赖中管理者,就需要手动去控制版本了。

二、tarter场景启动器

我们先来看一下 项目中 导入的依赖项:

spring-boot-starter-* :*就某种场景,只要引入starter,这个场景的所有常规需要的依赖我们都自动引入,所有的导入的依赖,底层都是 依赖于 spring-boot-starter

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter</artifactId>
  <version>2.3.4.RELEASE</version>
  <scope>compile</scope>
</dependency>

spring-boot-starter-web:帮我们导入了web模块正常运行所依赖的组件。

        <!--该依赖就是我们在创建 SpringBoot 工程勾选的那个 Spring Web 产生的-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

Spring Boot 将所有的场景全部整合起来,集成了一个个的 启动器 Starter, 我们只需要在项目中引入需要的 Starter 就行,所有相关的依赖就会导入进来,供我们使用,当然我们也可以自定义 Starter.

三、启动类

@SpringBootApplication 是 Spring Boot 框架中的一个核心注解,用于简化 Spring Boot 应用的配置。当你在一个类上使用了这个注解,它实际上是一个组合注解,包含了多个其他的 Spring 注解,用于自动配置和启用 Spring Boot 的一些特性。

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
​
@SpringBootApplication
public class SpringBootDemoApplication {
​
    public static void main(String[] args) {
        SpringApplication.run(SpringBootDemoApplication.class, args);
    }
​
}
  • @SpringBootApplication: 作用在类上,说明被标注的类是 SpringBoot 的主启动类, Spring Boot 就会这个类的main 方法,

        注:@SpringBootApplication 注解作用的类 应该在所有包的上一级。

  • @SpringBootConfiguration: Spring的配置类注解,标注在某个类上,表示这是一个springboot 配置类 (复合注解)

    • @Configuration: 说明这是一个配置类,配置类就是对应 Spring 的 xml 配置文件。

    • @Component:说明启动类本身就是一个组件,用来负责启动应用。

  • @EnableAutoConfiguration:开启自动装配的注解

    • @AutoConfigurationPackage:用来自动装配的注解。

    • @Import({AutoConfigurationPackages.Registrar.class}) : 自动配置 ‘包组件’,Spring底层注解@import ,给容器中导入一个组件,Registrar.class 作用:将主启动类的所在包及包下面所有子包里面的所有组件扫描到Spring容器 

  • @Import({AutoConfigurationImportSelector.class}) :给容器导入组件,AutoConfigurationImportSelector :自动配置导入选择器

四、SpringApplication.run分析

SpringBootApplication.java

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

SpringBootApplication.run方法主要分两部分:

一部分是SpringApplication的实例化,二是run方法的执行。

SpringApplication这个类主要做了以下四件事情:

(1)推断应用的类型是普通的项目还是Web项目

(2)查找并加载所有可用初始化器 , 设置到initializers属性中

(3)找出所有的应用程序监听器,设置到listeners属性中

(4)推断并设置main方法的定义类,找到运行的主类

run方法流程分析:

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

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

相关文章

Linux 时区设置函数 tzset()【man 3 tzset】

1. NAME&#xff08;名&#xff09; tzset, tzname, timezone, daylight - 初始化时间转换信息 2. SYNOPSIS&#xff08;概要&#xff09; #include <time.h>void tzset(void);extern char *tzname[2]; extern long timezone; extern int daylight;glibc的功能测试宏要…

Uniapp在屏幕尺寸低于960出现样式错乱(开箱即用)

我司项目突然要做平板兼容,我在调试的时候发现当屏幕尺寸低于960px发现样式但凡是以rpx单位的全部失效&#xff0c;如果是以px为单位那么影响就比较小&#xff0c;当时解决方案是写了不少媒体查询和把单位rpx改成px&#xff0c;后面查阅文档发现大错特错宽屏适配只需一行代码即…

2024.06.22 刷题日记

199. 二叉树的右视图 这道题目的思路就是层次遍历&#xff0c;然后每次处理每一层所有的元素&#xff0c;如果是第一个就收集到答案中&#xff1a; class Solution { public:vector<int> rightSideView(TreeNode* root) {if (!root)return {};queue<TreeNode*> q…

Kubernetes Ingress 简介

前言 Ingress 是 Kubernetes 中的一种资源对象&#xff0c;用于管理从集群外部到内部服务的 HTTP 和 HTTPS 路由。它提供了灵活的路由功能、SSL/TLS 终止、负载均衡和虚拟主机支持。Ingress 需要一个 Ingress 控制器来实际处理路由&#xff0c;并且可以通过配置不同的控制器来…

这4个手机应用,让你的生活工作更加方便

MillimeterPro MillimeterPro是一款适用于iPhone或iPad的测量工具应用&#xff0c;用户可以通过触摸屏快速进行长度测量、分割物体、测量物体比例&#xff08;W/H&#xff09;和面积等操作。 这款应用程序是一个多功能的测量工具&#xff0c;它可以帮助您在手机或平板电脑的屏…

(经验)高考填报志愿,有哪些坑你需要避开?

高考年年考&#xff0c;填报志愿的却年年都是新手.....哪些关于高考填报志愿的坑&#xff0c;依旧还继续坑....是时候做些改变了。过来人写的几点避坑&#xff0c;希望给这届新人做参考。 1、不要什么热门就报什么&#xff0c;因为有些东西别人学得很快&#xff0c;而我慢的像蜗…

示例:WPF中使用IsAsync的方式绑定数据来优化用户体验

一、目的&#xff1a;开发过程中&#xff0c;有时需要绑定大量数据&#xff0c;比如弹出一个窗口&#xff0c;窗口中包含一个ListBox绑定了大量数据&#xff0c;这时会出现点击按钮后出现假死卡顿影响用户体验&#xff0c;这理通过用IsAsync的方式将窗口优先弹出来再加载数据 二…

mysql高级语句2存储过程

CREATE VIEW 视图&#xff0c;可以被当作是虚拟表或存储查询。 视图跟表格的不同是&#xff0c;表格中有实际储存数据记录&#xff0c;而视图是建立在表格之上的一个架构&#xff0c;它本身并不实际储存数据记录。 临时表在用户退出或同数据库的连接断开后就自动消失了&…

计算机网络 静态路由及动态路由RIP

一、理论知识 1.静态路由 静态路由是由网络管理员手动配置在路由器上的固定路由路径。其优点是简单和对网络拓扑变化不敏感&#xff0c;缺点是维护复杂、易出错&#xff0c;且无法自动适应网络变化。 2.动态路由协议RIP RIP是一种基于距离向量的动态路由协议。它使用跳数作…

Unity Meta Quest 开发:关闭 MR 应用的安全边界

社区链接&#xff1a; SpatialXR社区&#xff1a;完整课程、项目下载、项目孵化宣发、答疑、投融资、专属圈子 &#x1f4d5;教程说明 这期教程我将介绍如何在应用中关闭 Quest 系统的安全边界。 视频讲解&#xff1a; https://www.bilibili.com/video/BV1Gm42157Zi 在 Unity…

示例:推荐一个应用Adorner做的表单对话框

一、目的&#xff1a;开发过程中经常会修改和查看一个Model的数据&#xff0c;一般情况下会自定义一个控件或Window去显示Model数据&#xff0c;但这种数据如果比较多会增加很多开发工作&#xff0c;本文介绍一种通用的方式&#xff0c;应用表达Form控件去简化处理&#xff0c;…

如何在Qt Designer中管理QSplitter

问题描述 当按下按钮时&#xff0c;我希望弹出一个对话框&#xff0c;用户可以在其中选择内容并最终按下 ‘Ok’ 按钮。我想在这个对话框中放置一个 QSplitter&#xff0c;左侧面板将显示树状结构&#xff0c;右侧将显示其他内容。如何正确实现这一点&#xff1f; 从 Qt 的示…

AI智能时代:ChatGPT如何在金融市场发挥策略分析与预测能力?

文章目录 一、ChatGPT在金融策略制定中的深度应用客户需求分析与定制化策略市场动态跟踪与策略调整策略分析与优化 二、ChatGPT在算法交易中的深度应用自动交易策略制定交易执行与监控风险管理 三、未来展望《智能量化&#xff1a;ChatGPT在金融策略与算法交易中的实践》亮点内…

说说 SSL 的错误认识和不足之处

最近明月在学习折腾 LNMP 期间无意中建了一个 Typecho 的博客小站&#xff0c;近一周的折腾下来&#xff0c;收获真的不少&#xff0c;致使兴趣也越来越浓了&#xff0c;在升级 LNMP 的时候捎带手的给这个 Typecho 博客也启用了 SSL。并且开启了 memcached 和 OPcache 优化加速…

Android面试题之动画+事件处理篇

1、Android 中的动画有哪几类 帧动画、补间动画、属性动画 2、动画能组合在一起使用么&#xff1f; 可以将动画组合在一起使用AnimatorSet&#xff0c; AnimatorSet.play() 播放当前动画的同时可以 .with() &#xff1a;将现有动画和传入的动画同时执行 .after() &#xff1a…

神经网络与深度学习 - 神经网络基础

1.2 神经网络基础 学习目标 知道逻辑回归的算法计算输出、损失函数知道导数的计算图知道逻辑回归的梯度下降算法知道多样本的向量计算 应用 应用完成向量化运算应用完成一个单神经元神经网络的结构 1.2.1 Logistic回归 逻辑回归是一个主要用于二分分类的算法。给定一个特…

Altera不同系列的型号命名规则

Altera芯片型号&#xff1a;10AX07H4F34I3SG 20nm工艺 资源&#xff1a; 大数据 云计算 人工智能 图像处理 MSEL

OS复习笔记ch12-1

文件系统 概述 文件是大多数应用程序的核心要素&#xff0c;文件系统是操作系统对用户来说最重要的部分之一。 本章的主要内容见下图&#xff1a; 文件&#xff0c;大家耳熟能详的就是的docx、pdf、jpg、MP4等各种后缀文件&#xff0c;根据任务需要文件又分成了文本、图片、…

c++ 中如何往 string 字符串类型里插入浮点数

谢谢&#xff0c;在看王老师课程时&#xff0c;有如此用法&#xff0c;单独拿出来记录一下 (2) 这是为什么呢&#xff1f; 其实 cout << 3.33 ; 这样的代码是可以直接编译通过。 cout 就是 ostream 类型的对象。此类对象可以保存任何类型的数据。 STL 库为我们写好了大量…

Linux 五种IO模型

注&#xff1a;还有一种信号驱动IO&#xff0c;使用较少暂不讨论&#xff1b; 一&#xff0c;区分阻塞、非阻塞和同步、异步 看了很多文章对这两组概念解释和对比&#xff0c;说的太复杂了&#xff0c;其实没必要&#xff0c;两句话就能说清楚。 首先&#xff0c;对于读数据rec…