SpringBoot应用启动内置Tomcat的过程源码分析

下面我将为您详细讲解“SpringBoot应用启动内置Tomcat的过程源码分析”。

SpringBoot应用启动流程

SpringBoot能够提供如此简单易用的开发体验,离不开对应用启动过程的封装和自动配置。下面是SpringBoot应用启动的大体流程:

  1. SpringBoot启动类加载:在启动类的main方法中触发SpringApplication.run()方法,通过实例化SpringApplication,完成对SpringBoot应用的初始化和启动。
  2. 加载SpringBoot配置:SpringApplication完成基本的初始化后,会根据classpath中的配置文件对应的配置,加载相应的配置信息,并应用到Spring Boot环境中。
  3. 创建Spring上下文:SpringBoot框架会自动创建一个Spring上下文(内部是使用AnnotationConfigApplicationContext实现),并加载应用的配置和自动配置Bean。容器启动过程中,会扫描bean的定义,并尝试创建它们,并把它们注入到Spring容器中。
  4. 执行Spring Boot自动配置:SpringBoot在启动过程中配置了一些常用的Bean,以及通过自动配置帮助开发者快速搭建应用框架所需要的Bean。
  5. 注册Servlet、Filter、Listener:SpringBoot能够帮助我们自动注册Servlet、Filter、Listener等Web组件。这些组件都被Tomcat支持,所以我们的应用需要启动Tomcat.
  6. 启动Tomcat:SpringBoot在启动时,默认内嵌了Tomcat作为Web容器。

SpringBoot内置Tomcat启动过程分析

当我们引入spring-boot-starter-web依赖后,SpringBoot会默认使用内置的Tomcat作为Web容器,让我们来看一下Tomcat内嵌启动的过程:

  1. 配置Tomcat参数

在SpringBoot启动环节中,spring-boot-starter-web依赖会自动配置Tomcat的启动参数。在org.springframework.boot.autoconfigure.web.embedded.TomcatWebServerFactoryCustomizer中,会给Tomcat容器设置端口、上下文根、获取参数等一系列参数。

  1. 创建Tomcat Server

接下来,org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryConfiguration中,会创建并返回一个Tomcat的ServletWebServerFactory。

  1. 配置Tomcat Server

org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryCustomizer会配置Tomcat Server,为其注册Connector、Context、ErrorHandler、Executor等。其中,包括注册ServletContainerInitializer。

  1. 添加配置(Filter、Servlet等)

org.springframework.boot.autoconfigure.web.servlet.ServletContextInitializerBeans为当前的WebApp添加Web组件,比如Filter、Servlet等。它会扫描当前classpath里的一些类,识别其中的ServletContextInitializer,通过RegistrationBean将其添加到Web容器中去。

  1. 启动Tomcat Server

在创建和配置完Tomcat Server对象之后,org.springframework.boot.web.embedded.tomcat.TomcatWebServer调用Tomcat的start()方法启动Tomcat,启动完成后,自动打印出Tomcat的启动日志。

示例

接下来,我将提供两个示例:

示例1:使用内置Tomcat服务器

  1. 创建一个SpringBoot项目:

shell
$ mkdir demo && cd demo
$ curl https://start.spring.io/starter.zip -d dependencies=web -o demo.zip
$ unzip demo.zip && rm demo.zip

  1. 编写Controller

src/main/java/com/demo/SampleController.java文件中编写以下代码:

```java
@RestController
public class SampleController {

   @RequestMapping("/")
   String home() {
       return "Hello World!";
   }

}
```

  1. 启动SpringBoot应用

shell
$ ./mvnw spring-boot:run

然后,你将看到SpringBoot成功启动,浏览器访问 http://localhost:8080 访问,页面输出 Hello World!。

示例2:集成自定义Filter

  1. 添加Filter依赖

pom.xml的dependencies下,添加如下配置:

xml
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>

  1. 添加Filter配置

src/main/java/com/demo/MyFilter.java文件中编写一个自定义Filter:

java
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("Init MyFilter...");
}
@Override
public void destroy() {
System.out.println("Destroy MyFilter...");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("MyFilter starts...");
filterChain.doFilter(servletRequest, servletResponse);
System.out.println("MyFilter ends...");
}
}

  1. 注册Filter

src/main/java/com/demo/FilterConfig.java中编写以下代码:

java
@Configuration
public class FilterConfig {
@Bean
public FilterRegistrationBean<MyFilter> filterRegistrationBean() {
FilterRegistrationBean<MyFilter> registrationBean = new FilterRegistrationBean<MyFilter>();
registrationBean.setFilter(new MyFilter());
registrationBean.addUrlPatterns("/*");
return registrationBean;
}
}

  1. 测试

最后编写Controller测试一下,如下所示:

java
@RestController
public class SampleController {
@GetMapping("/hello")
public String hello() {
return "Hello World!";
}
}

启动应用后,在浏览器中访问 http://localhost:8080/hello,页面会输出 Hello World!,并且控制台会输出以下日志信息:

Initializing Spring embedded WebApplicationContext
Root WebApplicationContext: initialization completed in xxx ms
MyFilter starts...
MyFilter ends...

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot应用启动内置Tomcat的过程源码分析 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • Java日期时间字符串和毫秒相互转换的方法

    下面是详细讲解Java日期时间字符串和毫秒相互转换的方法的攻略。 一、Java日期时间字符串转毫秒 1.1 SimpleDateFormat类 在Java中,可以使用SimpleDateFormat类来完成日期时间字符串的转换。SimpleDateFormat是Java中日期时间格式化类的一个子类,它继承了DateFormat类,提供了非常方便的日期时间格式…

    Java 2023年5月20日
    00
  • SpringBoot学习篇之@Valid与@Validated的区别

    下面是SpringBoot学习篇之@Valid与@Validated的区别的攻略。 一、@Valid和@Validated的作用 在SpringMVC中,@Valid和@Validated注解全部用于校验参数。使用它们可以大大简化代码和提高代码的可读性。 二、@Valid和@Validated的区别 @Valid是JSR-303/JSR-349规范中的注解,…

    Java 2023年5月20日
    00
  • Java实现学生管理系统详解流程

    Java实现学生管理系统详解流程 一、系统需求分析 1.1 系统功能需求 添加学生信息 删除学生信息 修改学生信息 查询学生信息 显示所有学生信息 1.2 系统性能需求 界面友好,操作简单明了 对学生信息进行持久化存储,确保数据不会丢失 查询、添加、删除、修改操作均要快速、正确 二、系统设计 2.1 数据库设计 使用MySQL数据库存储学生信息,设计学生表s…

    Java 2023年5月19日
    00
  • 深入了解Springboot核心知识点之数据访问配置

    深入了解Spring Boot核心知识点之数据访问配置 Spring Boot是一个非常流行的Java框架,它提供了许多便利的功能,其中包括数据访问。在本文中,我们将深入了解Spring Boot的数据访问配置,包括如何配置数据源、如何使用JdbcTemplate和如何使用Spring Data JPA。 配置数据源 在Spring Boot中,我们可以使用…

    Java 2023年5月15日
    00
  • 浅谈Java动态代理的实现

    浅谈 Java 动态代理的实现 什么是动态代理? Java 中的代理分为静态代理和动态代理两种。静态代理需要事先写好代理类,通过程序员手动编写的方式,代理对象和目标对象之间的关系就已经确定了。而动态代理是在程序运行时动态生成的代理对象,不需要事先写好代理类。动态代理可以根据目标对象动态地生成代理对象,无需为每个目标对象都编写代理类,增强代码的可重用性。 实现…

    Java 2023年5月26日
    00
  • Java中的递归方法示例介绍

    下面是我详细讲解“Java中的递归方法示例介绍”的完整攻略。 什么是递归方法 递归方法是指一个方法可以直接或者间接地调用自己的方法,这种方法通常用于解决那些可以被分割成几个同样情况的小问题的问题。 递归的基本原理是将一个大问题分割成若干具有相同解法的小问题,每个小问题又可以通过同一种方法进行进一步分解,直到最后可以解决这个问题或者其中一个问题。 在Java中…

    Java 2023年5月26日
    00
  • Java多线程中的Balking模式详解

    让我来给您详细讲解一下“Java多线程中的Balking模式”的攻略。 什么是Balking模式 Balking是一种设计模式,它用于在并发编程中避免重复执行代码。这种模式通常用于程序中存在运行条件无法实现的情况下(例如正在发生的网络超时或其他必要资源无法访问等)。 Balking模式的实现过程 Balking模式的核心思想是,检查并避免尝试重复执行正在发生…

    Java 2023年5月18日
    00
  • Spring Boot 整合 Thymeleaf 实例分享

    下面是 Spring Boot 整合 Thymeleaf 实例分享的完整攻略。 什么是Spring Boot和Thymeleaf Spring Boot是Spring框架的一款快速开发框架,可以快速搭建一个基础的web应用 Thymeleaf是一款非常流行的模板引擎,可以将数据渲染成HTML页面,使用简单,容易上手 如何整合Spring Boot和Thyme…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部