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 或其他格式,返回给客户端。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值