java springBoot项目 类加载与启动流程

Spring Boot 项目部署的准备阶段

假设你的 Spring Boot 项目已经打包成一个 .jar 文件,并且部署到服务器上。.jar 文件中包含了项目的所有类文件(.class),以及其他资源文件(如配置文件、静态资源等)。

部署的环境:
JVM(Java Virtual Machine):Java 程序需要在 JVM 上运行。JVM 是 Java 的运行时环境,负责类的加载、内存管理、垃圾回收等任务。
操作系统:Spring Boot 项目作为一个 .jar 文件,需要运行在支持 JVM 的操作系统上。

JVM 启动和类加载器(ClassLoader)初始化

你的项目打包成一个jar文件后在服务器上运行 java -jar app.jar 命令时,JVM 会启动,并开始加载程序所需的类文件。

启动类(Spring Boot 主类)加载

Spring Boot 项目的主类通常是一个包含 public static void main(String[] args) 方法的类。这是 Spring Boot 启动的入口。

JVM 启动:当你执行 java -jar your-app.jar 时,JVM 首先加载启动类所在的 .jar 文件。JVM 使用 ClassLoader 加载 Spring Boot 主类。

类加载器(ClassLoader)
默认情况下,JVM 会使用 启动类加载器(Bootstrap ClassLoader) 来加载一些核心的 JDK 类(例如 java.lang 包中的类)。
用户自定义的类和第三方库(如 Spring Boot 所需的库)则由 应用类加载器(App ClassLoader) 来加载。App ClassLoader 会从 .jar 文件或类路径中加载类文件。

加载启动类:JVM 会通过 App ClassLoader 加载 your-app.jar 中的主类(通常是带有 @SpringBootApplication 注解的类)。这个类是 Spring Boot 应用的入口。

启动类的初始化

在加载类之后,JVM 会进入 初始化 阶段。如果这个类包含静态代码块,或者类中有静态变量,它们会在初始化阶段被执行。

例如:Spring Boot 主类通常会调用 SpringApplication.run(Application.class, args) 来启动 Spring Boot 应用。

Spring Boot 启动时的类加载

当 Spring Boot 应用启动时,JVM 会通过类加载器加载主类(即带有 @SpringBootApplication 注解的启动类)。在启动过程中,Spring Boot 会加载并初始化所有与应用相关的类和 Bean,包括由 @Controller、@Service、@Repository 等注解的类。

启动过程详细步骤:

JVM 加载主类:首先,JVM 会通过类加载器加载 Spring Boot 应用的主类(通常是带有 public static void main(String[] args) 方法的类)。

Spring 容器初始化
Spring 容器通过 SpringApplication.run(Application.class, args) 方法启动。
在 run() 方法中,Spring Boot 会自动配置和启动 Spring 容器,并根据 @SpringBootApplication 注解配置扫描和初始化相关的组件。

类的加载与实例化
Spring Boot 会扫描项目中的所有类,特别是标注了 @Component、@Controller、@Service、@Repository 等注解的类,并将它们注册到 Spring 容器中。
Spring 会根据类的依赖关系,通过 依赖注入(例如构造器注入或字段注入)将这些类实例化并注入到 Spring 容器中。

Spring 容器中的 Bean 初始化
Spring 容器会为每个类创建 Bean,并初始化这些 Bean。对于带有静态变量和静态代码块的类,Spring 会在初始化阶段执行这些静态初始化。

Web 项目特有的初始化(如果是 Web 项目)
如果是 Web 项目,Spring Boot 会自动初始化嵌入式 Web 容器(如 Tomcat)。Spring Boot 还会配置 DispatcherServlet,它会作为所有 HTTP 请求的入口,负责请求的分发。

HTTP 请求的到来与请求处理

当前端发送 HTTP 请求到 Spring Boot 应用时,Spring Boot 不会重新加载类和 Bean,而是直接通过已经初始化好的类和 Bean 来处理请求。

请求处理的详细步骤

请求接收:当 HTTP 请求到达时,Spring Boot 的嵌入式 Web 容器(如 Tomcat)会接收到请求,并将请求转发给 Spring 的 DispatcherServlet。

请求分发:DispatcherServlet 负责根据请求的 URL 和 HTTP 方法(如 GET、POST)找到匹配的 Controller 方法,执行相应的处理逻辑。Spring MVC 的 HandlerMapping 会帮助 DispatcherServlet 找到合适的 Controller。

控制器方法执行:DispatcherServlet 会调用相应的 Controller 方法。
Spring 会将请求参数(如请求体、URL 参数等)绑定到 Controller 方法的参数上(通过 @RequestParam、@PathVariable、@RequestBody 等注解)。
Controller 方法中的业务逻辑会被执行,这时相关的对象和数据会被创建,并放入 JVM 的运行空间中。

Bean 的创建与注入:在处理请求时,Spring 会根据需要创建和注入 Bean。如果 Controller 中有依赖的服务(例如 @Service 注解的类),这些依赖会被 Spring 自动注入。

返回响应:Controller 方法执行完后,Spring 会将返回结果(可能是一个视图名,或者一个 REST API 返回值)通过视图解析器或者直接通过 @ResponseBody 转换为 JSON 或其他格式,返回给客户端。

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

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

相关文章

SQL 中的 EXISTS

我们先从 SQL 中最基础的 WHERE 子句开始。 比如下面这条 SQL 语句: 很显然,在执行这条 SQL 语句的时候,DBMS 会扫描 Student 表中的每一条记录,然后把符合 Sdept IS 这个条件的所有记录筛选出来,并放到结果集里面去…

C语言链表通关文牒0.5

之前排序创建链表那里用的是哨兵法,但是有局限性,这里介绍一个补充,不创建第一个空节点进行排序 NODE *create() {int val;NODE *head NULL; // 初始化头指针为NULLNODE *pC NULL; // 初始化指针,用于遍历链表while(1) {pri…

GAN对抗生成网络(一)——基本原理及数学推导

1 背景 GAN(Generative Adversarial Networks)对抗生成网络是一个很巧妙的模型,它可以用于文字、图像或视频的生成。 例如,以下就是GAN所生成的人脸图像。 2 算法思想 假如你是《古董局中局》的文物造假者(Generator,生成器)&a…

基于Python的携程旅游景点数据分析与可视化

基于Python的携程旅游景点数据分析与可视化 爬取景点、价格、开放状态、评论、热度、优惠政策等信息。 功能列表 指定城市爬取支持登录支持筛选支持评论爬取支持数据存在数据库支持生成Excel支持可视化 部分效果演示 爬取的旅游景点信息 生成Excel 指定城市爬取 可视化 部门…

SQL-leetcode-197. 上升的温度

197. 上升的温度 表: Weather ---------------------- | Column Name | Type | ---------------------- | id | int | | recordDate | date | | temperature | int | ---------------------- id 是该表具有唯一值的列。 没有具有相同 recordDate 的不同行。 该表包…

等待事件 ‘latch: row cache objects‘ 说明及解决方法

早上刚来的时候,收到zabbix 数据库连接数增长的告警,同时应用负责人也说查询很慢、很卡 查看该时间段 最多的等待事件 SELECT event,COUNT(1) num FROM V$ACTIVE_SESSION_HISTORY A WHERE A.SAMPLE_TIME BETWEEN TO_DATE(2025-01-02 09:00:00, YYYY-M…

HAL 库------中断相关函数

HAL_SuspendTick();是对SysTick中CTRL寄存器中TICKINT位清0 HAL_ResumeTick(); 刚好与上面函数相反,对SysTick中CTRL寄存器中TICKINT位置1,恢复stick中断。

IDEA开发Java应用的初始化设置

一、插件安装 如下图所示: 1、Alibaba Java Coding Guidelines 2.1.1 阿里开发者规范,可以帮忙本地自动扫描出不符合开发者规范的代码,甚至是代码漏洞提示。 右击项目,选择《编码规约扫描》,可以进行本地代码规范扫…

QT-------------多线程

实现思路 QThread 类简介: QThread 是 Qt 中用于多线程编程的基础类。可以通过继承 QThread 并重写 run() 方法来创建自定义的线程逻辑。新线程的执行从 run() 开始,调用 start() 方法启动线程。 掷骰子的多线程应用程序: 创建一个 DiceThre…

在C语言基础上的C++(深入理解类和对象)

1:构造函数 1:为什么使用构造函数 由于类的封装性,一般来说,数据成员是不能被外界访问的,所以对象的数据成员的初始化工作就给共有函数来完成了。如果定义了构造函数,那么只要对象一建立,就可…

ESP32_H2-ESP32_H2(IDF)学习系列-安装官方组件

1、 在VS Code项目工程中添加IDF组件注册表中的组件十分便捷。您只需按下“CtrlShiftP”快捷键快速进入命令面板,或者通过菜单栏的“查看”选项,选择“命令面板”来打开它。随后,在命令面板中输入“ESP-IDF: Show Component Registry”即可展…

【UE5】UnrealEngine源码构建2:windows构建unreal engine 5.3.2

参考大神知乎的文章:UE5 小白也能看懂的源码编译指南 据说会耗费400G的空间。 代码本身并不大,可能是依赖特别多,毕竟看起来UE啥都能干,核心还是c++的, 【UE5】UnrealEngine源码构建1:tag为5.3.2源码clone 本着好奇+ 学习的态度,想着也许有机会能更为深入的熟悉UE的机制…

[Qt] 常用控件 | QWidget | “表白程序2.0”

目录 一、控件概述 控件体系的发展阶段: 二、QWidget 核心属性 核心属性概览: 1、enabled 2、Geometry 实例 1: 控制按钮的位置 实例 2: 表白 程序 i、Window Frame 的影响 ii、API 设计理念 iii、Geometry 和 FrameGeometry 的区别 &#xf…

laravel部署到云服务器上,除了首页之外,区域页面找不到路由

laravel部署到云服务器上,除了首页之外,区域页面找不到路由,都是报404错误 解决方法: (注:本人服务器使用宝塔面板) 打开宝塔面板,找到该站点->配置文件 在下方增加如下代码 …

git注意事项

提交代码的备注 feat : 开发 新增功能 fix: 修复 git相关 1. git安装及全局用户设置 Git安装 npm install git -ggit修改用户名邮箱密码 git config --global --replace-all user.name "要修改的用户名" git config --global --replace-all user.email"要修改…

Agent系列:AppAgent v2-屏幕智能Agent(详解版)

引言 简介 方法 Agent 框架 Agent 交互 探索阶段 部署阶段 文档生成 高级功能 实验结果 总结 局限性 未来工作 1. 引言 大语言模型(LLM)如 ChatGPT 和 GPT-4 显著提升了自然语言处理能力,并且推动了智能体在自主决策中的应用。…

flink cdc oceanbase

接上文:一文说清flink从编码到部署上线 环境:①操作系统:阿里龙蜥 7.9(平替CentOS7.9);②CPU:x86;③用户:root。 预研初衷:现在很多项目有国产化的要求&#…

Docker 安装与配置 Nginx

摘要 1、本文全面介绍了如何在 Docker 环境中安装和配置 Nginx 容器。 2、文中详细解释了如何设置 HTTPS 安全连接及配置 Nginx 以实现前后端分离的代理服务。 2、同时,探讨了通过 IP 和域名两种方式访问 Nginx 服务的具体配置方法 3、此外,文章还涵…

C语言格式输出

1.转换字符说明: 2.常用的打印格式: 在 C 语言中,格式输出主要依靠 printf 函数来实现。以下是一些 C 语言格式输出的代码举例及相关说明。 printf("%2d",123),因为输出的部分有三位数,但是要求…

yolov5核查数据标注漏报和误报

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、误报二、漏报三、源码总结 前言 本文主要用于记录数据标注和模型预测之间的漏报和误报思想及其源码 提示:以下是本篇文章正文内容,…