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