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日

相关文章

  • centos 7.5 部署varnish缓存服务器功能

    以下是“centos 7.5 部署varnish缓存服务器功能”的完整攻略。 安装Varnish 步骤1:添加 Varnish 源 在 CentOS7.5 系统上,Varnish 是通过第三方源安装的。因此,第一步是添加 Varnish 源和密钥。 sudo yum install epel-release sudo rpm –nosignature -i…

    Java 2023年6月15日
    00
  • spring boot 配置动态刷新实现详解

    下面就为大家介绍“springboot配置动态刷新实现详解”的完整攻略。 一、概述 在使用SpringBoot时,有时候需要对应用程序的配置进行变更,需要重新启动应用程序才能使配置生效,这就非常繁琐。因此,为了解决这个问题,一些第三方库就提出了SpringCloud Config的方案,通过配置中心实现配置修改后能够自动刷新到应用程序当中,但是这也存在着一些…

    Java 2023年5月15日
    00
  • 在JavaScript中调用Java类和接口的方法

    在JavaScript中调用Java类和接口的方法,一般需要通过Java的JavaScript引擎来实现。下面,我们将详细介绍调用Java类和接口方法的完整攻略。 步骤一:创建Java类和接口 为了在JavaScript中调用Java类和接口的方法,我们首先需要创建相应的Java类和接口。这里以Java类Calculator和Java接口Greeting为例…

    Java 2023年5月26日
    00
  • Netty分布式抽象编码器MessageToByteEncoder逻辑分析

    Netty是一个高性能、可扩展、可定制、易用的NIO框架,不仅支持传统的TCP和UDP协议,还支持HTTP、WebSocket等协议。Netty的分布式抽象编码器MessageToByteEncoder是其中非常重要的一个组件,下面将对其进行详细讲解。 1. MessageToByteEncoder的概述 MessageToByteEncoder是Netty…

    Java 2023年5月20日
    00
  • 如何设置一定时间内只能发送一次请求

    要实现一定时间内只能发送一次请求,可以使用令牌桶算法来控制请求的频率。该算法的实现分为两个部分,一个是令牌桶的生成,另一个是令牌桶的消费。 令牌桶的生成 令牌桶生成的过程是不断往桶里添加令牌,直到桶的大小达到了上限。每隔一定时间添加一个令牌,即令牌的添加速率为r(个/s),则添加一个令牌的时间间隔为1/r(s)。 为了保证当前添加令牌的时间间隔不会过大,可以…

    Java 2023年6月15日
    00
  • Win10搭建Pyspark2.4.4+Pycharm开发环境的图文教程(亲测)

    下面是Win10搭建Pyspark2.4.4+Pycharm开发环境的图文教程: 环境搭建前准备 在开始搭建Pyspark2.4.4+Pycharm开发环境之前,需要先进行以下几个准备工作: 安装Java:Pyspark需要Java环境,因此需要先安装Java。可以从Oracle官网下载最新版的Java,并按照安装步骤进行安装。 安装Anaconda:Ana…

    Java 2023年5月20日
    00
  • 全方位讲解Java的面向对象编程思想

    全方位讲解Java的面向对象编程思想 一、什么是面向对象编程思想 面向对象编程思想(Object Oriented Programming, OOP)是一种编程范式,它将数据和操作数据的方法打包在一起,通过封装、继承、多态等特性,使得程序更具有可重用性、可维护性、可扩展性。 在Java中,一切皆对象,Java程序也是由对象组成的。面向对象编程思想是Java的…

    Java 2023年5月26日
    00
  • 浅谈java中字符串数组、字符串、整形之间的转换

    浅谈Java中字符串数组、字符串、整形之间的转换 在Java开发中,字符串数组、字符串和整形的相互转换是非常常见的操作。本攻略将详细介绍不同类型的数据之间的转换方法。 字符串数组和字符串的转换 将字符串数组转换为字符串 我们可以使用Java提供的String.join()方法将字符串数组转换成一个字符串。该方法将数组元素连接为一个字符串,每个元素之间插入指定…

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